在 Linux/UNIX 系統中,awk 是一個功能強大的編輯工具,逐行讀取輸入文本,並根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,能夠在無交互的狀況下實現至關複雜的文本操做,被普遍應用於 Shell 腳本,完成各類自動化配置任務。linux
awk 所使用的命令格式以下所示,其中,單引號加上大括號「{}」用於設置對數據進行的處理動做。awk 能夠直接處理目標文件,也能夠經過「-f」讀取腳本對目標文件進行處理。shell
awk 選項 '模式或條件 {編輯指令}' 文件 1 文件 2 „ //過濾並輸出文件符條件的內容 awk -f 腳本文件 文件 1 文件 2 „ //從腳本中調用編輯指令,過濾並輸出內容 7
awk 比較傾向於將一行分紅多個「字段」而後再進行處理,且默認狀況下字段的分隔符爲空格或者 tab 鍵。awk 執行結果能夠經過 print 的功能將字段數據打印顯示。在使用 awk 命令的過程當中,可使用邏輯操做符「&&」,表示「與」, 「||」表示「或」,「!」表示「非」;還能夠進行簡單的數學運算,如+、-、*、/、%、^分別 表示加、減、乘、除、取餘和乘方。
找出/etc/passwd 的用戶名、用戶 ID、組 ID 等列, 執行如下 awk 命令便可。centos
[root@localhost ~]# awk -F : '{print $1,$3,$4}' /etc/passwd root 0 0 bin 1 1 daemon 2 2 adm 3 4 lp 4 7 sync 5 0 shutdown 6 0 halt 7 0 mail 8 12 operator 11 0 games 12 100 ftp 14 50 nobody 99 99 systemd-network 192 192 dbus 81 81 polkitd 999 998 abrt 173 173 libstoragemgmt 998 996 rpc 32 32 colord 997 995 saslauth 996 76 rtkit 172 172 pulse 171 171 chrony 995 991 rpcuser 29 29 nfsnobody 65534 65534 ntp 38 38 tss 59 59 usbmuxd 113 113 geoclue 994 989 qemu 107 107 radvd 75 75 setroubleshoot 993 988 sssd 992 987 gdm 42 42 gnome-initial-setup 991 986 sshd 74 74 avahi 70 70 postfix 89 89 tcpdump 72 72 chen 1000 1000
awk 從輸入文件或者標準輸入中讀入信息,與 sed 同樣,信息的讀入也是逐行讀取的。不一樣的是 awk 將文本文件中的一行視爲一個記錄,而將一行中的某一部分(列)做爲記錄中的一個字段(域)。爲了操做這些不一樣的字段,awk 借用 shell 中相似於位置變量的方法, 用$一、$二、$3„順序地表示行(記錄)中的不一樣字段。另外 awk 用$0 表示整個行(記錄)。不一樣的字段之間是經過指定的字符分隔。awk 默認的分隔符是空格。awk 容許在命令行中用「-F 分隔符」的形式來指定分隔符。bash
awk 包含幾個特殊的內建變量(可直接用)以下所示:
(1)FS:指定每行文本的字段分隔符,默認爲空格或製表位。
(2)NF:當前處理的行的字段個數。
(3)NR:當前處理的行的行號(序數)。
(4)$0:當前處理的行的整行內容。
(6)FILENAME:被處理的文件名。
(7)RS9:數據記錄分隔,默認爲\n,即每行爲一條記錄。dom
[root@localhost ~]# awk '{print $0}' chen.txt [root@localhost ~]# awk '{print}' chen.txt //這條命令和上面一條是同樣的效果 #version=DEVEL #System authorization information aulth --enableshadow --passalgo=sha512 #Use CDROM installation media cdlrom. thethethe.
[root@localhost ~]# awk 'NR==1,NR==3{print}' chen.txt //這條命令和下面命令是同樣的效果 [root@localhost ~]# awk '(NR>=1)&&(NR<=3){print}' chen.txt #version=DEVEL #System authorization information aulth --enableshadow --passalgo=sha512
[root@localhost ~]# awk '(NR%2)==1{print}' chen.txt Use CDROM installation media cdrom. thethethe. THE THEASDHAS Use graphical install. graphical. best test ASSDJFXYxyzC AxyzxyzxyzC keyboard --vckeymap=cn --xlayouts='cn' System language
[root@localhost ~]# awk '(NR%2)==0{print}' chen.txt Use graphical install. graphical. best test ASSDJFXYxyzC AxyzxyzxyzC keyboard --vckeymap=cn --xlayouts='cn' System language lang zh_CN.UTF-8 Network information network --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate network --hostname=localhost.localdomain Root password rootpw --iscrypted $6$L.egxzosoP/0k9Nj$wna7vPXZjeH0jFcNZUymYKF8ySXq5HxQuvxTFxIpEAAxuDj7MQJtXBds5E0LxAftI1H5JbJuYpN44d5n6t1AZ. System services
awk '/^The/{print}' chen.txt THE THEASDHAS
[root@localhost ~]# awk '/limit.$/{print}' chen.txt Use graphical install limit.
[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END{print x}' /etc/passwd
[root@localhost ~]# awk 'BEGIN {RS="the"};END{print NR}' chen.txt
[root@localhost ~]# awk -F : '{print $3}' /etc/passwd 0 1 2 3 4 5 6 7 8 9 10 11
[root@localhost ~]# awk -F : '{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192
[root@localhost ~]# awk -F : '$2== "*"{print}' /etc/shadow bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: lp:*:17110:0:99999:7::: sync:*:17110:0:99999:7::: shutdown:*:17110:0:99999:7::: halt:*:17110:0:99999:7::: mail:*:17110:0:99999:7::: operator:*:17110:0:99999:7::: games:*:17110:0:99999:7:::
[root@localhost ~]# awk '($1~"nfs")&&(NF=7){print $1,$2}' /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS
[root@localhost ~]# awk -F : '($7!="/bin/bash")&&($7!="/sbin/nologin")' /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
[root@localhost ~]# awk -F : '/bash$/{print | "wc -l"}' /etc/passwd 2
[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ;{print n-2}}' 2
[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; print $0}' localhost.localdomain
sort 是一個以行爲單位對文件內容進行排序的工具,也能夠根據不一樣的數據類型來排序。例如數據和字符的牌局就不同。sort 命令的語法爲「sort [選項] 參數」,其中經常使用的選項包括如下幾種。
(1)-f:忽略大小寫;
(2)-b:忽略每行前面的空格;
(3)-M:按照月份進行排序;
(4)-n:按照數字進行排序;
(5)-r:反向排序;
(6)-u:等同於 uniq,表示相同的數據僅顯示一行;
(7)-t:指定分隔符,默認使用[Tab]鍵分隔;
(8)-o <輸出文件>:將排序後的結果轉存至指定文件;
(9)-k:指定排序區域。ssh
排序規則是開頭按字母排序,若是開頭都是同樣的就按照第二個字母從小到大tcp
[root@localhost ~]# sort /etc/passwd abrt:x:173:173::/etc/abrt:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin chen:x:1000:1000:chen:/home/chen:/bin/bash chrony:x:995:991::/var/lib/chrony:/sbin/nologin colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
[root@localhost ~]# sort -t : -rk 3 /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin chrony:x:995:991::/var/lib/chrony:/sbin/nologin geoclue:x:994:989:User for geoclue:/var/lib/geoclue:/sbin/nologin setroubleshoot:x:993:988::/var/lib/setroubleshoot:/sbin/nologin sssd:x:992:987:User for sssd:/:/sbin/nologin gnome-initial-setup:x:991:986::/run/gnome-initial-setup/:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin
[root@localhost ~]# sort -t : -k 3 /etc/passwd -o chench.txt [root@localhost ~]# cat chench.txt root:x:0:0:root:/root:/bin/bash chen:x:1000:1000:chen:/home/chen:/bin/bash qemu:x:107:107:qemu user:/:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbi
Uniq 工具在 Linux 系統中一般與 sort 命令結合使用,用於報告或者忽略文件中的重複行。具體的命令語法格式爲:uniq [選項] 參數。其中經常使用選項包括如下幾種。
(1)-c:進行計數;
(2)-d:僅顯示重複行;
(3)-u:僅顯示出現一次的行;ide
[root@localhost ~]# cat a.txt centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.2 centos7 6.6 centos7 6.2 centos7 6.2 centos7 6.3 centos7 6.5 linux 1 linux 2 linux 3 linux 4 linux 5 linux 6
[root@localhost ~]# uniq a.txt centos7 6.2 centos7 6.6 centos7 6.2 centos7 6.3 centos7 6.5 linux 1 linux 2 linux 3 linux 4 linux 5 linux 6
[root@localhost ~]# uniq -c a.txt 1 5 centos7 6.2 1 centos7 6.6 2 centos7 6.2 1 centos7 6.3 1 centos7 6.5 1 linux 1 1 linux 2 1 linux 3 1 linux 4 1 linux 5 1 linux 6 1
[root@localhost ~]# uniq -d a.txt centos7 6.2 centos7 6.2