目錄
- 一. 簡介
- 二. 基本語法
- 三. 小案例
一. 簡介
paste 命令用于合并多個文件的行,按列方式輸出,默認以制表符(Tab)分隔。
?基本語法
paste [選項] 文件1 文件2 ...
二. 基本語法
<()
的方式模擬文件流paste
命令將2個文件流粘貼在一起- 💥注意:如果是真實文件的話,需要注意換行符是linux系統的換行符
LF
,而不是Windows系統的CRLF
,否則會丟失數據。
apluser@ubuntu24-01:~$ seq 3
1
2
3
apluser@ubuntu24-01:~$ echo -e "A\nB\nC"
A
B
C
apluser@ubuntu24-01:~$ paste <(seq 3) <(echo -e "A\nB\nC")
1 A
2 B
3 C
-s
:實現行轉列
apluser@ubuntu24-01:~$ paste -s <(seq 3)
1 2 3
apluser@ubuntu24-01:~$ paste -s -d "," <(seq 3)
1,2,3
-d
:指定分隔符
apluser@ubuntu24-01:~$ paste -s <(echo -e "A\nB\nC")
A B C
apluser@ubuntu24-01:~$ paste -s -d "_" <(echo -e "A\nB\nC")
A_B_C
apluser@ubuntu24-01:~$ paste -s -d "," <(seq 3) <(echo -e "A\nB\nC")
1,2,3
A,B,C
三. 小案例
?有如下日志,現要求將下面的字段抽取出來
- 線程號
- isuuePayId
- jmw_state
apluser@ubuntu24-01:~/work/20250324$ cat system_info.log
2323 SEQIN mmm isuuePayId=5768awe uuid=woenoo; jmw_state=success method=paypay info=ppp
2323 SEQOUT COST=45726
2345 SEQIN mmm isuuePayId=34895ry uuid=;ljkler jmw_state=faile method=alipay info=ddd
2345 SEQOUT COST=34855
2355 SEQIN mmm isuuePayId=544ttf uuid=ouih990 jmw_state=success method=paypay info=iii
2355 SEQOUT COST=857
2370 SEQIN mmm isuuePayId=86nny uuid=ksdfgh999 jmw_state=faile method=linepay info=lll
2370 SEQOUT COST=5453
- 先通過
SEQIN
關鍵詞進行初步的過濾 - 再通過
-e
配置項將各個指定的字段抽取出來 - 抽取之后的數據,有若干行,只有1列
apluser@ubuntu24-01:~/work/20250324$ grep "SEQIN" system_info.log | grep -o -e "^\S*" -e "isuuePayId=\S*" -e "jmw_state=\S*"
2323
isuuePayId=5768awe
jmw_state=success
2345
isuuePayId=34895ry
jmw_state=faile
2355
isuuePayId=544ttf
jmw_state=success
2370
isuuePayId=86nny
apluser@ubuntu24-01:~/work/20250324$ grep "SEQIN" system_info.log | grep -o -e "^\S*" -e "isuuePayId=\S*" -e "jmw_state=\S*" > temp.dat
- 每3行要合并為一行,可以通過split命令指定行數進行切分
apluser@ubuntu24-01:~/work/20250324$ split -l 3 temp.dat part_ --numeric-suffixes --additional-suffix=.log
apluser@ubuntu24-01:~/work/20250324$
apluser@ubuntu24-01:~/work/20250324$ ls -l part_*
-rw-rw-r-- 1 apluser apluser 42 Mar 24 21:24 part_00.log
-rw-rw-r-- 1 apluser apluser 40 Mar 24 21:24 part_01.log
-rw-rw-r-- 1 apluser apluser 41 Mar 24 21:24 part_02.log
-rw-rw-r-- 1 apluser apluser 38 Mar 24 21:24 part_03.log
apluser@ubuntu24-01:~/work/20250324$
apluser@ubuntu24-01:~/work/20250324$ cat part_00.log
2323
isuuePayId=5768awe
jmw_state=success
🧐上面的命令可以通過下面這種方式組合起來使用
- 其中
split -l 3 - part_
中的-
作為split命令的輸入 split
可以從標準輸入讀取數據【-
代表標準輸入】
grep "SEQIN" system_info.log | grep -o -e "^\S*" -e "isuuePayId=\S*" -e "jmw_state=\S*" | \
split -l 3 - part_ --numeric-suffixes=0 --additional-suffix=.log
- 然后可以通過
paste
命令的-s
選項進行列轉行,并且通過-d
選項指定分隔符
apluser@ubuntu24-01:~/work/20250324$ paste -s -d "," part_*
2323,isuuePayId=5768awe,jmw_state=success
2345,isuuePayId=34895ry,jmw_state=faile
2355,isuuePayId=544ttf,jmw_state=success
2370,isuuePayId=86nny,jmw_state=faile