AWK 技巧(取倒列,過濾行,匹配,不匹配,內置變量等)


 

使用awk取某一行數據中的倒數第N列$(NF-(n-1))
比如取/etc/passwd文件中的第2列、倒數第1、倒數第2、倒數第4列(以冒號為分隔符)。($NF表示倒數第一列,$(NF-1)表示倒數第二列)

[root@ipsan-node06 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@ipsan-node06 ~]# awk -F":" '{print $2,$(NF),$(NF-1),$(NF-3)}' /etc/passwd
x /bin/bash /root 0
x /sbin/nologin /bin 1
x /sbin/nologin /sbin 2
x /sbin/nologin /var/adm 4
x /sbin/nologin /var/spool/lpd 7
x /bin/sync /sbin 0
x /sbin/shutdown /sbin 0
x /sbin/halt /sbin 0
x /sbin/nologin /var/spool/mail 12
x /sbin/nologin /root 0

linux實現將文本文件每一行中相同第一列對應的其他列進行拼接

[root@jump-v4 ~]# sort b.txt|uniq
1    34
1    49
2    45
2    48
3    54
3    57
3    89

[root@jump-v4 ~]# sort b.txt|uniq|awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' 
1: 34 49
2: 45 48
3: 54 57 89

命令解析:
1)首先sort test|uniq實現對test文件的去重,去掉了重復的 1 49,保留不同的行;
2)awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' 表示的含義是: 將每一行的第一列最為數組a的key,
   第二列作為a的value,同時碰到相同的key,就把其值進行拼接,linux的shell的字符串拼接形式為str = (str  “ ” $var),
   最后遍歷數組a,其中i為數組a的每一個key,a[i]為key對應的值;

使用awk命令獲取文本的某一行,某一列的技巧:

1)打印文件的第一列(域) : awk '{print $1}' filename
2)打印文件的前兩列(域) : awk '{print $1,$2}' filename
3)打印完第一列,然后打印第二列 : awk '{print $1 $2}' filename
4)打印文本文件的總行數 : awk 'END{print NR}' filename
5)打印文本第一行 :awk 'NR==1{print}' filename
6)打印文本第二行第一列 :sed -n "2, 1p" filename | awk 'print $1'

Awk取文件中的指定數據

[root@jump-v4 ~]# cat a.txt
123.122.123.12 12121212
121.2332.121.11 232323
255.255.255.255 21321
123.122.123.12 12121212
123.122.123.12 1212121er2
123.122.123.12 12121212eer
123.122.123.12 12121212ere
255.255.255.255 21321
121.2332.121.11 232323
255.255.255.255 21321

[root@jump-v4 ~]# cat a.txt|awk '{print $1}'
123.122.123.12
121.2332.121.11
255.255.255.255
123.122.123.12
123.122.123.12
123.122.123.12
123.122.123.12
255.255.255.255
121.2332.121.11
255.255.255.255

[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c
      2 121.2332.121.11
      5 123.122.123.12
      3 255.255.255.255

[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'
121.2332.121.11 2
123.122.123.12 5
255.255.255.255 3

[root@jump-v4 ~]# cat a.txt|awk '{print $1}'|sort|uniq -c|awk '{print $2,$1}'|sort -k2 -rn
123.122.123.12 5
255.255.255.255 3
121.2332.121.11 2

linux文件按大小來排序

[root@cdn ~]# ls -s | sort -k 1 -n
表示對第一個字段(即文件大小)按數值大小進行排序;
如果想倒序,可以增加-r參數;
sort命令可進行排序;
-k參數表示對第幾個字段進行排序;
ls -s:第一列顯示的是文件大小

定時刪除resin日志的腳本,每小時刪除一次

[root@cdn ~]# cat resin-log.sh
#!/bin/bash
cd /data/log/resin && find /data/log/resin \( -name "*jvm-app-0.log.*" -a ! -name "*.gz" \) -a -mmin +30 -exec gzip  {} \;

[root@cdn ~]# crontab -l
0 * * * * /bin/bash -x /root/resin-log.sh >/dev/null 2>&1

awk 獲取某些列的某些行(打印或不打印第幾行)

NR==n 表示打印第n行
NR!=n 表示不打印第n行

1)取test.txt文件中的第1,2列,不打印第一行
[root@bz4citestap1014 app_zhibiao.sh]# cat test.txt
wang 11 aa
shi  22 bb
kevin 33 cc
grace 44 dd
hui 55 ee
[root@bz4citestap1014 app_zhibiao.sh]# awk 'NR!=1 {print $1,$2}' test.txt
shi 22
kevin 33
grace 44
hui 55

2)取test.txt文件中的第3列的第2行
[root@bz4citestap1014 app_zhibiao.sh]# awk 'NR==2 {print $3}' test.txt  
bb

awk中的"匹配"與"不匹配"

~ 匹配正則
!~ 不匹配正則
== 等於
!= 不等於

[root@kevin~]# cat test.txt
afjdkj 80
lkdjfkja 8080
dfjj 80
jdsalfj 808080
jasj 80
jg 80
linuxidc 80
80 ajfkj
asf 80
80 linuxidc
wang bo
kevin grace
ha  80880

1) 打印上面test文件中第二列匹配80開頭並以80結束的行
[root@kevin~]# awk '{if($2~/^80$/)print}' test.txt 
afjdkj 80
dfjj 80
jasj 80
jg 80
linuxidc 80
asf 80

2)打印上面test文件中第二列中不匹配80開頭並以80結束的行
[root@kevin~]# awk '{if($2!~/^80$/)print}' test.txt 
lkdjfkja 8080
jdsalfj 808080
80 ajfkj
80 linuxidc
wang bo
kevin grace
ha  80880

3)打印上面test文件中第二列是"bo"的行
[root@kevin~]# cat test.txt |awk '{if($2=="bo")print}'
wang bo

AWK的內置變量(NF、NR、FNR、FS、OFS、RS、ORS)

NF   字段個數,(讀取的列數) 
NR   記錄數(行號),從1開始,新的文件延續上面的計數,新文件不從1開始 
FNR  讀取文件的記錄數(行號),從1開始,新的文件重新從1開始計數 
FS   輸入字段分隔符,默認是空格 
OFS  輸出字段分隔符 默認也是空格 
RS   輸入行分隔符,默認為換行符 
ORS  輸出行分隔符,默認為換行符

示例文件test:
[rootkevin ~]# cat test
zhong guo ren is noce!
beijing is a good city。
sheg as juf 88u kk
halt:x:7:0:halt /sbin:/sbin/halt
operator x 0:operator /root:/sbin/nologin

1)NF:讀取記錄的字段數(列數)
[rootkevin ~]# awk -F" " '{print "字段數: " NF}' test
字段數: 5
字段數: 5
字段數: 5
字段數: 2
字段數: 4

如上,awk在讀取文件時,按行讀取,每一行的字段數(列數),賦值給內置變量NF,打印出來的就是每行的字段總數。

[rootkevin ~]# awk '{print $NF}' test
noce!
city。
kk
/sbin:/sbin/halt
/root:/sbin/nologin

如果有需求,只需要最后一列的數據,由於每一行的列數不一,最后一列無法指定固定的列數,可以使用NF來表示列數$NF表示打印出等於總列數的那一列的數據,
顯而易見就是打印最后一列的數據。

2)NR:讀取文件的行數(在某些應用場景中可以當作行號來使用)
[rootkevin ~]# awk '{print "行號為:" NR}' test
行號為:1
行號為:2
行號為:3
行號為:4
行號為:5

如上,打印出讀取文件的行數,因為是按行讀取,在應用場景中,行數可以等同於行號,用來輸出對應行的行號,NR 還可以用作判斷輸出,如下簡單例子:
[rootkevin ~]# awk '{if(NR>2)print "行號為:" NR }' test 
行號為:3
行號為:4
行號為:5

3)FNR:讀取文件的行數,但是和"NR"不同的是當讀取的文件有兩個或兩個以上時,NR讀取完一個文件,行數繼續增加 而FNR重新從1開始記錄
[rootkevin ~]# cp test test1
[rootkevin ~]# awk '{print "NR:"NR "FNR:"FNR}' test test1      
NR:1FNR:1
NR:2FNR:2
NR:3FNR:3
NR:4FNR:4
NR:5FNR:5
NR:6FNR:1
NR:7FNR:2
NR:8FNR:3
NR:9FNR:4
NR:10FNR:5

打印的兩列之間加上空格
[rootkevin ~]# awk '{print "NR:"NR " " "FNR:"FNR}' test test1
NR:1 FNR:1
NR:2 FNR:2
NR:3 FNR:3
NR:4 FNR:4
NR:5 FNR:5
NR:6 FNR:1
NR:7 FNR:2
NR:8 FNR:3
NR:9 FNR:4
NR:10 FNR:5

由上可知,NR從一開始一直增加,FNR每讀取到一個新的文件,行數重新從一開始增加。

有一個有趣的應用,比較兩個文件A,B是否一致,以A作為參考,不一致的輸出行號
[rootkevin ~]# cat A 
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5

[rootkevin ~]# cat B
a aa aaa 1
b bb bbb 2
c cc ccc 3
d dd ddd 4
e ee eee 5

[rootkevin ~]# awk '{if(NR==FNR){arry[NR]=$0}else{if(arry[FNR]!=$0){print FNR}}}' A B
3

4)FS:輸入字段分割符,默認是以空格為分隔符,在日常中常常文本里面不都以空格分隔,此時就要指定分割符來格式化輸入。
[rootkevin ~]# cat test2
a,b,c
1,2,3
aa,dd,ee
[rootkevin ~]# awk '{print $1}' test2             
a,b,c
1,2,3
aa,dd,ee

[rootkevin ~]# awk 'BEGIN{FS=","}{print $1}' test2
a
1
aa

使用-F參數也可以
[rootkevin ~]# awk -F"," '{print $1}' test2
a
1
aa

5)OFS:輸出字段分割符,默認為空格,如果讀進來的數據是以空格分割,為了需求可能要求輸出是以"-"分割,可以使用OFS進行格式化輸出。
[rootkevin ~]# cat test3
a aa aaa 1
b bb bbb 2
c cc ccc
d dd ddd 4
e ee eee 5
[rootkevin ~]# awk 'BEGIN{FS=" ";OFS="--"}{print $1,$2,$3}' test3
a--aa--aaa
b--bb--bbb
c--cc--ccc
d--dd--ddd
e--ee--eee

[rootkevin ~]# awk -vOFS="|" 'NF+=0' test3
a|aa|aaa|1
b|bb|bbb|2
c|cc|ccc
d|dd|ddd|4
e|ee|eee|5

[rootkevin ~]# cat test6
172.10.10.10
172.10.10.11
172.10.10.12
172.10.10.13
172.10.10.14
[rootkevin ~]# awk 'BEGIN{FS=".";OFS="--"}{print $1,$2,$3}' test6      
172--10--10
172--10--10
172--10--10
172--10--10
172--10--10

6)RS:輸入行分隔符,判斷輸入部分的行的起始位置,默認是換行符
[rootkevin ~]# cat test4
a,b,c
d,e,f
g,h,i
j,k,l
[rootkevin ~]# awk 'BEGIN{RS=","}{print}' test4
a
b
c
d
e
f
g
h
i
j
k
l

[rootkevin ~]# 

這里說明一下,RS=","將以,為分割當作一行,即a被當作一行,b也被當作一行,但是細心的會發現和d之間是沒有","的為什么也當作一行了呢,
是因為輸入中c后面還有一個換行符\n 即,輸入應該是a,b,c\n只不過\n我們看不到,輸入中,a一行,b一行,c\nd一行但是輸出的時候系統會將\n視為換行符,
所以看上去c和d是兩行,實際上是一行。

7)ORS:輸出行分割符,默認的是換行符,它的機制和OFS機制一樣,對輸出格式有要求時,可以進行格式化輸出
[rootkevin ~]# cat test5
1 22,aa:bb
haha,hehe
aa bb cc
[rootkevin ~]# awk 'BEGIN{ORS=" "}{print}' test5
1 22,aa:bb haha,hehe aa bb cc 

[rootkevin ~]# cat test6
172.10.10.10
172.10.10.11
172.10.10.12
172.10.10.13
172.10.10.14
[rootkevin ~]# awk 'BEGIN{ORS=","}{print}' test6
172.10.10.10,172.10.10.11,172.10.10.12,172.10.10.13,172.10.10.14,

也可以如下實現以","隔開放在一行
[rootkevin ~]# cat test6|xargs
172.10.10.10 172.10.10.11 172.10.10.12 172.10.10.13 172.10.10.14
[rootkevin ~]# cat test6|xargs|sed 's/ /,/g'
172.10.10.10,172.10.10.11,172.10.10.12,172.10.10.13,172.10.10.14

AWK對文件的"某一列進行去重"的做法      (命令: awk '{a[$n]=$0}END{for(i in a)print a[i]}' filename)

命令:awk '{a[$n]=$0}END{for(i in a)print a[i]}' filename
解釋:對filename文件的第n列進行去重

舉例:
1)對kevin.txt文件的第一列進行去重
[root@bobo tmp]# cat kevin.txt 
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:30:40
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:31:14
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:31:13
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:31:13
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:31:12
FFM_理財平台系統 FFM_scial 2019-11-09 11:34:37
ASI_賬管服務整合 ASI-OPsmart 2019-11-09 13:12:34
ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53
IID_智惠存 IID_wmpayment 2019-11-12 15:38:53
SIX_安全基礎工具 SIX_microservice_config 2019-11-11 19:34:45
DDI_茹能 DDI_from 2019-11-13 21:09:13
FFM_理財平台系統 FFM_scial 2019-11-13 21:27:08
SCC_信貸系統 SCC-index 2019-11-12 21:29:59
GGA_賬務管理中心 GGA_IFPmar 2019-11-13 22:01:48
UPI_智能用戶平台 UPI_CMSO 2019-11-13 22:23:26
UPI_智能用戶平台 UPI_CMSO 2019-11-13 22:51:13
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-13 10:10:16
FFM_理財平台系統 FFM_scial 2019-11-08 17:17:04
MPB_手機銀行APP MPB_bizzManagement 2019-11-08 18:49:27
SIX_安全基礎工具 SIX_microservice_config 2019-11-12 15:50:57
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22
CIM_渠道內部管理系統 CIM_cimservice 2019-11-13 17:06:27
CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26
ASI_賬管服務整合 ASI-OPsmart 2019-11-13 19:34:07

[root@bobo tmp]# awk '{a[$1]=$0}END{for(i in a)print a[i]}' kevin.txt 
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22
ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53
CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26
ASI_賬管服務整合 ASI-OPsmart 2019-11-13 19:34:07
FFM_理財平台系統 FFM_scial 2019-11-08 17:17:04
SIX_安全基礎工具 SIX_microservice_config 2019-11-12 15:50:57
ABB-倉庫系統 ABB-pay-ce 2019-11-08 23:31:12
UPI_智能用戶平台 UPI_CMSO 2019-11-13 22:51:13
DDI_茹能 DDI_from 2019-11-13 21:09:13
MPB_手機銀行APP MPB_bizzManagement 2019-11-08 18:49:27
GGA_賬務管理中心 GGA_IFPmar 2019-11-13 22:01:48
SCC_信貸系統 SCC-index 2019-11-12 21:29:59

2)對test.txt文件的第三列進行去重
[root@bobo tmp]# cat test.txt 
1 anhui wangbo 90
2 henan hexin  78
3 shenzhen wangbo 89
4 shanghai zhoumen 98
5 liuzhou  hexin  96
6 xinhuang wangbo 77
7 suzhou  zhupin  95
8 ningbo  niuping 100
9 chongqing wangbo 93
10 meizhou  lishuyan 98

[root@bobo tmp]# awk '{a[$3]=$0}END{for(i in a)print a[i]}' test.txt 
8 ningbo  niuping 100
9 chongqing wangbo 93
4 shanghai zhoumen 98
7 suzhou  zhupin  95
5 liuzhou  hexin  96
10 meizhou  lishuyan 98

AWK 將列轉為行的做法

1)如下,將a1.txt文件中的列轉為行,並用逗號隔開
[root@bobo tmp]# cat a1.txt               
1
2
3
4
5

[root@bobo tmp]# awk '{printf "%s,",$1}' a1.txt 
1,2,3,4,5,

上面列轉為行后,去掉最后一個逗號
[root@bobo tmp]# awk '{printf "%s,",$1}' a1.txt|sed 's/.$//'
1,2,3,4,5
[root@bobo tmp]# awk '{printf "%s,",$1}' a1.txt | awk '{sub(/.$/,"")}1'
1,2,3,4,5
# awk '{printf "%s,",$1}' a1.txt | awk '{printf $0"\b \n"}'
1,2,3,4,5 

也就是說,shell去掉最后一個字符,有下面三種方式實現:
sed 's/.$//'
awk '{sub(/.$/,"")}1'
awk '{printf $0"\b \n"}' ufile


2)如下,將a2.txt文件中的列轉為行,並用冒號隔開。
[root@bobo tmp]# cat a2.txt
a 1
b 2
c 3
d 4

注意下面實現的幾種效果。
可以用$1,$2,...$n,也可以使用$0表示文件全部列轉為行。
每列轉為行后,行與行之間的隔開形式
[root@bobo tmp]# awk '{printf "%s,",$1$2}' a2.txt  
a1,b2,c3,d4,

[root@bobo tmp]# awk '{printf "%s,",$1,$2}' a2.txt  
a,b,c,d,

[root@bobo tmp]# awk '{printf "%s,",$1" "$2" "}' a2.txt
a 1 ,b 2 ,c 3 ,d 4 ,

[root@bobo tmp]# awk '{printf "%s,",$0}' a2.txt           
a 1,b 2,c 3,d 4,

[root@bobo tmp]# awk '{printf "%s,",$0}' a2.txt |sed 's/.$//'
a 1,b 2,c 3,d 4

3)將下面test.list文件中的列轉為行,並逗號隔開
[root@bobo tmp]# cat test.list
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22
ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53
CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26

下面兩種方式實現效果一樣
[root@bobo tmp]# awk '{printf "%s,",$1" "$2" "$3" "$4}' test.list
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22,ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53,CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26,

[root@bobo tmp]# awk '{printf "%s,",$0}' test.list                
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22,ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53,CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26,

去掉最后一個逗號
[root@bobo tmp]# awk '{printf "%s,",$0}' test.list|sed 's/.$//'
PMS_項目信息管理系統 PMS_PMSConsole 2019-11-08 21:27:22,ICS_智能客服系統 ICS_basic-pass 2019-11-11 15:01:53,CIM_渠道內部管理系統 CIM_cimbizz 2019-11-13 17:06:26

shell將多行轉為一行(或將多行中的某一列轉化為行)的做法

常習慣於使用xargs將多行轉為一行,示例如下:
1)將ip.list文件中的每行ip轉化到一行里面,並使用逗號隔開:
[root@localhost ~]# cat ip.list 
192.168.10.10
192.168.10.11
192.168.10.12
192.168.10.13
192.168.10.14
192.168.10.15
192.168.10.16
192.168.10.17
192.168.10.18
192.168.10.19
192.168.10.20

使用xargs命令就會將管道符|前面輸出內容放在一行,並默認使用空格隔開
[root@localhost ~]# cat ip.list|xargs
192.168.10.10 192.168.10.11 192.168.10.12 192.168.10.13 192.168.10.14 192.168.10.15 192.168.10.16 192.168.10.17 192.168.10.18 192.168.10.19 192.168.10.20

再結合sed將空格替換為逗號
[root@localhost ~]# cat ip.list|xargs|sed -i 's/ /,/g'
sed: no input files
xargs: echo: terminated by signal 13

注意:
sed使用-i參數時,后面必須要跟具體的文件名,-i參數表示替換效果已在文件中生效!
如果不使用-i參數,則表示替換效果僅僅在當前終端展示里生效,並不會在文件中生效!
[root@localhost ~]# cat ip.list|xargs|sed 's/ /,/g'   
192.168.10.10,192.168.10.11,192.168.10.12,192.168.10.13,192.168.10.14,192.168.10.15,192.168.10.16,192.168.10.17,192.168.10.18,192.168.10.19,192.168.10.20

注意:
這里替換結果不能直接重定向到原來的文件ip.list中,因為前面cat命令正在讀,這里如果將替換結果重定向到ip.list文件中,會造成ip.list文件為空!
應該重定向到別的一個文件中,然后再mv到原來的ip.list文件
[root@localhost ~]# cat ip.list|xargs|sed 's/ /,/g' > ip.list_tmp 
[root@localhost ~]# mv ip.list_tmp ip.list
mv: overwrite ‘ip.list’? y
[root@localhost ~]# cat ip.list
192.168.10.10,192.168.10.11,192.168.10.12,192.168.10.13,192.168.10.14,192.168.10.15,192.168.10.16,192.168.10.17,192.168.10.18,192.168.10.19,192.168.10.20

2)將test.txt文件中的內容放在一行,並使用<<<<<<隔開
[root@localhost ~]# cat test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[root@localhost ~]# cat test.txt|xargs|sed 's/ /<<<<<</g'           
root:x:0:0:root:/root:/bin/bash<<<<<<bin:x:1:1:bin:/bin:/sbin/nologin<<<<<<daemon:x:2:2:daemon:/sbin:/sbin/nologin<<<<<<adm:x:3:4:adm:/var/adm:/sbin/nologin

3)將kevin.txt文件中的第二列內容放在一行,並使用分開隔開
[root@localhost ~]# cat kevin.txt
wangbo 90 abc
zhangkai 93 ccs
liuru 88 ffn
mamin 95 efe
huomei 85 cbs
haoke 91 mmn

[root@localhost ~]# cat kevin.txt|awk '{print $2}'|xargs
90 93 88 95 85 91
[root@localhost ~]# cat kevin.txt|awk '{print $2}'|xargs|sed 's/ /;/g'
90;93;88;95;85;91

再看看下面的轉化
[root@localhost ~]# cat kevin.txt
wangbo 90 abc
zhangkai 93 ccs
liuru 88 ffn
mamin 95 efe
huomei 85 cbs
haoke 91 mmn

[root@localhost ~]# cat kevin.txt|awk '{print $1":"$2}' 
wangbo:90
zhangkai:93
liuru:88
mamin:95
huomei:85
haoke:91

[root@localhost ~]# cat kevin.txt|awk '{print $1":"$2}'|xargs
wangbo:90 zhangkai:93 liuru:88 mamin:95 huomei:85 haoke:91

[root@localhost ~]# cat kevin.txt|awk '{print $1":"$2}'|xargs|sed 's/ /,/g'
wangbo:90,zhangkai:93,liuru:88,mamin:95,huomei:85,haoke:91

shell去掉最后一個字符的做法

刪除最后的那個字符,下面三種方法可以實現:
1)sed 's/.$//'
2)awk '{sub(/.$/,"")}1'
3)awk '{printf $0"\b \n"}' ufile

舉例如下:
1)刪除test.txt 文件中所有行的最后一個字符
[root@bobo tmp]# cat test.txt
www.kevin.com/
www.haha.com//uh
www.hehe.com/a

[root@bobo tmp]# cat test.txt|sed 's/.$//'
www.kevin.com
www.haha.com//u
www.hehe.com/

[root@bobo tmp]# cat test.txt|awk '{sub(/.$/,"")}1'
www.kevin.com
www.haha.com//u
www.hehe.com/

[root@bobo tmp]# awk '{printf $0"\b \n"}' test.txt 
www.kevin.com 
www.haha.com//u 
www.hehe.com/ 

2)刪除bo.txt 文件中所有行的最后一個字符
[root@bobo tmp]# cat bo.txt
192.168.10.154
192.168.10.159
192.168.10.160
model_C
model_D
stop_time_out=120
start_time_out=400

[root@bobo tmp]# cat bo.txt|sed 's/.$//'
192.168.10.15
192.168.10.15
192.168.10.16
model_
model_
stop_time_out=12
start_time_out=40

[root@bobo tmp]# cat bo.txt|awk '{sub(/.$/,"")}1'
192.168.10.15
192.168.10.15
192.168.10.16
model_
model_
stop_time_out=12
start_time_out=40

[root@bobo tmp]# awk '{printf $0"\b \n"}' bo.txt 
192.168.10.15 
192.168.10.15 
192.168.10.16 
model_ 
model_ 
stop_time_out=12 
start_time_out=40 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM