shell三劍客之awk(包括sort排序和uniq工具)

shell三劍客之awk(包括sort排序和uniq工具)

shell三劍客之awk

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

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

awk工具命令格式

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

一.awk用法

(1)輸出全部內容,等同於 cat chen.txt,

[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.

(2)輸出第 1~3 行內容

[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

(3)輸出全部奇數行的內容

[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

(4)輸出全部偶數行的內容

[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

(5)輸出全部偶數行的內容

awk '/^The/{print}' chen.txt
 THE
THEASDHAS

(6)輸出以limit.結尾的行

[root@localhost ~]# awk '/limit.$/{print}' chen.txt
Use graphical install limit.

(7)統計以/bin/bash 結尾的行數,等同於greo -c 「/bin/bash」 chen.txt

[root@localhost ~]# awk 'BEGIN {x=0} ; /\/bin\/bash$/{x++};END{print x}' /etc/passwd

(8)統計以the分隔的文本段落數

[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

(1)輸出每行中的第1,3個字段

[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

(2)輸出密碼爲「*」的用戶的shadow 記錄

[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:::

(3)輸出以冒號分隔且第 7 個字段中包含/bash 的行的第 1 個字段

[root@localhost ~]# awk '($1~"nfs")&&(NF=7){print $1,$2}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS

(4)輸出第 7 個字段既不爲/bin/bash 也不爲/sbin/nologin 的全部行

[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

(二)經過管道,雙引號調用shell命令

調用wc -l 命令統計使用bash 的用戶個數,等同於 grep -c 「bash$」 /etc/passwd

[root@localhost ~]# awk -F : '/bash$/{print | "wc -l"}' /etc/passwd
2

(1)調用w 命令,並用來統計在線用戶數

[root@localhost ~]# awk 'BEGIN {while ("w" | getline) n++ ;{print n-2}}'
2

(2)調用hostname,並輸出當前的主機名

[root@localhost ~]# awk 'BEGIN {"hostname" | getline ; print $0}'
localhost.localdomain

三.sort 工具

sort 是一個以行爲單位對文件內容進行排序的工具,也能夠根據不一樣的數據類型來排序。例如數據和字符的牌局就不同。sort 命令的語法爲「sort [選項] 參數」,其中經常使用的選項包括如下幾種。
(1)-f:忽略大小寫;
(2)-b:忽略每行前面的空格;
(3)-M:按照月份進行排序;
(4)-n:按照數字進行排序;
(5)-r:反向排序;
(6)-u:等同於 uniq,表示相同的數據僅顯示一行;
(7)-t:指定分隔符,默認使用[Tab]鍵分隔;
(8)-o <輸出文件>:將排序後的結果轉存至指定文件;
(9)-k:指定排序區域。ssh

1:將/etc/passwd 文件中的帳號進行排序。

排序規則是開頭按字母排序,若是開頭都是同樣的就按照第二個字母從小到大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

(1)將/etc/passwd 文件中第三列進行反向排序

[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

(2)將/etc/passwd 文件中第三列進行排序,並將輸出內容保存至user.txt 文件中

[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工具

Uniq 工具在 Linux 系統中一般與 sort 命令結合使用,用於報告或者忽略文件中的重複行。具體的命令語法格式爲:uniq [選項] 參數。其中經常使用選項包括如下幾種。
(1)-c:進行計數;
(2)-d:僅顯示重複行;
(3)-u:僅顯示出現一次的行;ide

1:刪除 a 文件中的重複行。

[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

uniq工具刪除重複可是隻刪除連續重複的

(2)刪除 a 文件中的重複行,並在行首顯示該行重複出現的次數

[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

(3)查找 testfile 文件中的重複行。

[root@localhost ~]# uniq -d a.txt
centos7 6.2
centos7 6.2

謝謝收看

相關文章
相關標籤/搜索