awk技巧(如取某一行資料中的倒數第N列等)

散盡浮華發表於2018-02-28

 

使用awk取某一行資料中的倒數第N列$(NF-(n-1))
比如取/etc/passwd檔案中的第2列、倒數第1、倒數第2、倒數第4列(以冒號為分隔符)

[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

相關文章