Shell腳本正則表達式之——awk、sort、uniq,內含多個小Demo

awk工具

在Linux/UNIX系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,並根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,能夠再無交互的狀況下實現至關複雜的文本操做,被普遍應用於Shell腳本,完成各類自動化配置任務。java

1.awk常見用法:
一般狀況下 awk 所使用的命令格式以下所示,其中,單引號加上大括號「{}」用於設置對數據進行的處理動做。awk 能夠直接處理目標文件,也能夠經過「-f」讀取腳本對目標文件進行處理。vim

Demo1:

查出/etc/passwd的用戶名等列,執行以下命令bash

[root@localhost ~]# awk -F ':' '{print $1,$3,$4}' /etc/passwd
root 0 0
bin 1 1
daemon 2 2
//如下省略多行

awk 包含幾個特殊的內建變量(可直接用)以下所示:

FS:指定每行文本的字段分隔符,默認爲空格或製表位。
NF:當前處理的行的字段個數。
NR:當前處理的行的行號(序數)。
$0:當前處理的行的整行內容。
$n:當前處理行的第 n 個字段(第 n 列)。
FILENAME:被處理的文件名。
RS:數據記錄分隔,默認爲\n,即每行爲一條記錄。

按行輸出文本:dom

[root@localhost ~]# awk 'NR==1,NR==3{print}' /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

[root@localhost ~]# awk -F ":" 'NR==1,NR==3{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2

[root@localhost ~]# awk -F ":" '(NR>=1)&&(NR<=3){print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
輸出全部奇偶行的內容:
奇數行:
[root@localhost ~]# awk -F ":" 'NR%2==1{print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
nobody 99
dbus 81
abrt 173
rpc 32
saslauth 996
pulse 171
rpcuser 29
ntp 38
usbmuxd 113
qemu 107
setroubleshoot 993
gdm 42
sshd 74
postfix 89
zhou 1000
named 25
偶數行:
[root@localhost ~]# awk -F ":" 'NR%2==0{print $1,$3}' /etc/passwd
bin 1
adm 3
sync 5
halt 7
operator 11
ftp 14
systemd-network 192
polkitd 999
libstoragemgmt 998
colord 997
rtkit 172
chrony 995
nfsnobody 65534
tss 59
geoclue 994
radvd 75
sssd 992
gnome-initial-setup 991
avahi 70
tcpdump 72
dhcpd 177
輸出以root開頭的行:
[root@localhost ~]# awk '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
統計以/bin/bash結尾的行數:
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END {print x}' /etc/passwd
2
統計以空行分隔的文本段落數:
[root@localhost opt]# vim name.txt
zhangsan:lisi:wangwu
zhaoliu:liuliu
heiba:heihei
[root@localhost opt]# awk 'BEGIN{RS=":"};END{print NR}' /opt/name.txt
5
//統計規則:遇到關鍵符號,折行
字段輸出:
[root@localhost opt]# awk -F ":" '$3=="0"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@localhost opt]# awk -F ":" '$3=="0"{print $1,$7}' /etc/passwd
root /bin/bash

輸出密碼爲空的用戶的shadow記錄:
[root@localhost opt]# awk 'BEGIN{FS=":"};$3=="0"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

輸出以冒號分隔且第7個字段包含bash:
[root@localhost opt]# awk -F : '$7~"bash"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhou:x:1000:1000:zhou:/home/zhou:/bin/bash

以冒號爲分隔,輸出第一個字段包含nfs且總字段數爲7的第1,3,7字段
方法一:[root@localhost opt]# awk -F : '($1~"nfs")&&(NF==7){print $1,$3,$7}' /etc/passwd
nfsnobody 65534 /sbin/nologin
方法二:[root@localhost opt]# awk 'BEGIN{FS=":"};($1~"nfs")&&(NF==7){print $1,$3,$7}' /etc/passwd
nfsnobody 65534 /sbin/nologin

以冒號爲分隔,第七個字段不包含/sbin/nologin且總字段爲7的,1,3,7字段
[root@localhost opt]# awk 'BEGIN{FS=":"};($7!="/sbin/nologin")&&(NF==7){print $1,$3,$7}' /etc/passwd
root 0 /bin/bash
sync 5 /bin/sync
shutdown 6 /sbin/shutdown
halt 7 /sbin/halt
zhou 1000 /bin/bash
named 25 /bin/false
調用wc -l 命令統計使用bash 的用戶個數:
[root@localhost opt]# awk -F : '/bash$/{print | "wc -l"}' /etc/passwd
2
調用w 命令,並用來統計在線用戶數:
[root@localhost opt]# awk 'BEGIN {while ("w" | getline) n++;{print n-2}}'
1
調用hostname,並輸出當前的主機名:
[root@localhost opt]# awk 'BEGIN {"hostname" | getline ; print $0}'
localhost.localdomain

sort工具

在 Linux 系統中,經常使用的文件排序工具備三種:sort、uniq、wc, 其中sort 是一個以行爲單位對文件內容進行排序的工具,也能夠根據不一樣的數據類型來排序。例如數據和字符的牌局就不同。sort 命令的語法爲「sort [選項] 參數」,其中經常使用的選項包括如下幾種。ssh

-f:忽略大小寫tcp

-b:忽略每行前面的空格ide

-M:按照月份進行排序工具

-n:按照數字進行排序post

-r:反向排序code

-u:等同於 uniq,表示相同的數據僅顯示一行

-t:指定分隔符,默認使用[Tab]鍵分隔

-o <輸出文件>:將排序後的結果轉存至指定文件

-k:指定排序區域

uniq工具

Uniq 工具在 Linux 系統中一般與 sort 命令結合使用,用於報告或者忽略文件中的重複行。具體的命令語法格式爲:uniq [選項] 參數。其中經常使用選項包括如下幾種。

-c:進行計數

-d:僅顯示重複行

-u:僅顯示出現一次的行

相關文章
相關標籤/搜索