awk工具
- awk -F ':' '$3<$4' /etc/passwd
- awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
- awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
- head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
- awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
- head -n3 /etc/passwd | awk -F ':' '{print NF}‘
- head -n3 /etc/passwd | awk -F ':' '{print NR}‘
- awk 'NR>40' /etc/passwd
- awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
- head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
- awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
- awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
awk工具 兩個字段相互比較
- awk -F ':' '$3<$4' test.txt //比較第3段小於第4段的,並匹配打印出來
[root@localhost awk]# awk -F ':' '$3<$4' test.txt //比較第3段小於第4段的,並匹配打印出來
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost awk]#
awk工具 兩個字段相等
- awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
[root@localhost awk]# awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
[root@localhost awk]#
awk工具 匹配大於5的字符,小於7的字符
- awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大於5的字符,和小於7的字符,並打印出來所在行
- 這裏雙引號裏面的數字表示 字符 ——>經過ASCII碼進行比較
- 數字比大寫字母小,大寫字母比小寫字母小
- 用雙引號中字符的的第1個字符去和第3段進行比較
- && 表示 和 的意思
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大於5的字符,和小於7的字符,並打印出來所在行
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
tss:x:59:59:/var/spool/postfix:/sbin/nologin
[root@localhost awk]#
這裏的59是是在字符5和字符7之間的,因此就會匹配出來
awk工具 匹配大於94的段,或等於/sbin/nologin的段
- awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大於94的段,或者第7段等於/sbin/nologin的段所在的行都打印出來
[root@localhost awk]# vim test.txt
[root@localhost awk]# awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大於94的段,或者第7段等於/sbin/nologin的段所在的行都打印出來
yroot:x:95:95:root:/root
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
[root@localhost awk]#
awk工具 匹配的段不精準匹配 ~
- awk -F ':' '$3>94 || $7 ~ /bash/' test.txt //匹配第三段大於94的段,或者第7段包含/bin/的段,並都打印出來
- == 就是嚴格匹配
- ~ 這個只要包含就算匹配
- 舉例:
- == 的話,第七段只能爲/bin/bash纔算符合
- ~ 的話,第七段裏只要有bash 就算符合,好比/sbin/bash, bin123 都算匹配
[root@localhost awk]# awk -F ':' '$3>94 || $7 ~ /bin/' test.txt //匹配第三段大於94的段,或者第7段包含/bin/的段,並都打印出來
yroot:x:95:95:root:/root
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
等等等,只截取了一部分
[root@localhost awk]#
awk工具 OFS
- 如有多段的時候,分隔符能夠用 # @ 替換,指定分隔符;還有另一個功能,就是OFS,這是一個內置的變量,
- -F 這是指定分段前的字符
- OFS用來指定 print 時候用到的分隔符—>注意 語法!!
- awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' test.txt //匹配第3段大於94的段,或者第七段包含bin的段,而後打印第1,第3,第7段,用 #號 區分
- 語法:在分割完以後,單引號裏面用花括號括起來,給它指定print用到的分隔符OFS ,而後再寫條件,最後在寫print語句
[root@hf-01 awk]# head -n5 test.txt |awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' //在前5行中,匹配第3段大於94的段,或者第七段包含bin的段,而後打印第1,第3,第7段,用 #號 區分
root#0#/bin/bash
bin#1#/sbin/nologin
daemon#2#/sbin/nologin
adm#3#/sbin/nologin
lp#4#/sbin/nologin
[root@hf-01 awk]#
- awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割
- 上下表達式相同
- 在使用if的時候,須要加一些符號,可是使用if 的表達式則更加規範
- awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt
[root@hf-01 awk]# awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割
nobody@99@/sbin/nologin
polkitd@999@/sbin/nologin
avahi-autoipd@170@/sbin/nologin
mysql@1000@/bin/bash
systemd-network@192@/sbin/nologin
[root@hf-01 awk]#
awk工具 兩個內置的變量
- OFS是打印print的時候,指定的變量符
- NR 表示 行
- NF 表示 段
- head -n5 test.txt |awk -F ':' '{print NR":"$0}' test.txt //在前5行中,打印出全部的行
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NR":"$0}' //在前5行中,打印出全部的行
1:root:x:0:0:root:/root:/bin/bash
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@hf-01 awk]#
- head -n5 test.txt |awk -F ':' '{print NF":"$0}' test.txt //在前5行中,打印全部的段
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NF":"$0}' //在前5行中,打印全部的段
6:rootx:0:0:root:/root:/bin/bash
7:bin:x:1:1:bin:/bin:/sbin/nologin
7:daemon:x:2:2:daemon:/sbin:/sbin/nologin
7:adm:x:3:4:adm:/var/adm:/sbin/nologin
7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@hf-01 awk]#
awk工具 NR 表示 行
- sed -n '1,10'p test.txt //打印前十行
- awk -F ':' 'NR<=10' test.txt //打印前十行
- awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt //匹配前10行中,第1段包含root或者sync的段,並把這一行打印出來
[root@hf-01 awk]# awk -F ':' 'NR<=10' test.txt //打印前十行
rootx: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@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //匹配前10行中,第1段包含root或者sync的段,並把這一行打印出來
rootx:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
[root@hf-01 awk]#
awk工具 NF 表示 段
- awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,並在第1段包含root或者sync的段,並把這一行打印出來
[root@hf-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,並在第1段包含root或者sync的段,並把這一行打印出來
rootx:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
awk工具 $NR":"$NF
- awk -F ':' '{print $NR":"$NF}' test.txt //就是文件的第幾行一直匹配最後一段,一直持續到第七段結束(只有7段,因此後面爲空) - $NR 表示多少行 - $NF 表示7段
[root@hf-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt
rootx:/bin/bash //文件第一行爲 rootx 匹配最後一段 /bin/bash
x:/sbin/nologin //文件第二行爲 x 匹配最後一段 /sbin/nologin
2:/sbin/nologin //......以此類推下去
4:/sbin/nologin
lp:/sbin/nologin
/sbin:/bin/sync
/sbin/shutdown:/sbin/shutdown
:/sbin/halt //由於$NR只有七行,因此在打印後面的時候,行爲空
:/sbin/nologin
:/sbin/nologin
等等等,只截取了一部分
[root@hf-01 awk]#
awk工具 賦值
- head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段賦值爲root
- 一旦賦值以後,會看到分隔符消失了
- 這時只須要定義下 OFS 便可
- head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段賦值爲root,並定義分割符爲:
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段賦值爲root
root 0 0 root /root /bin/bash
root x 1 1 bin /bin /sbin/nologin
root x 2 2 daemon /sbin /sbin/nologin
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段賦值爲root,並定義分割符爲:
root:0:0:root:/root:/bin/bash
root:x:1:1:bin:/bin:/sbin/nologin
root:x:2:2:daemon:/sbin:/sbin/nologin
[root@hf-01 awk]#
awk工具 tot值求和
- awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt //每次tot值循環,就會把第三段相加
- tot 表示求和
- 在第一次tot求和的時候,是爲0與第3段相加,而後依次循環,一直到第3段結束,而後輸出tot值
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
2847
[root@hf-01 awk]#