awk、grep、sed是linux操作文字的三大利器,合稱文字三劍客,也是必須掌握的linux命令之一。三者的功能都是處理文字,但側重點各不相同,其中屬awk功能最強大,但也最複雜。grep更適合單純的查詢或匹配文字,sed更適合編輯匹配到的文字,awk更適合格式化文字,對文字進行較複雜格式處理。
Linux系統中grep命令是一種強大的文字搜尋工具,它能使用正則表達式搜尋文字,並把匹配的行列印出來(匹配到的標紅)。grep全稱是Global Regular Expression Print,表示全域性正則表達式版本,它的使用許可權是所有使用者。
grep的工作方式是這樣的,它在一個或多個檔案中搜尋字串模板。如果模板包括空格,則必須被參照,模板後的所有字串被看作檔名。搜尋的結果被送到標準輸出,不影響原檔案內容。
grep可用於shell指令碼,因爲grep通過返回一個狀態值來說明搜尋的狀態,如果模板搜尋成功,則返回0,如果搜尋不成功,則返回1,如果搜尋的檔案不存在,則返回2。我們利用這些返回值就可進行一些自動化的文字處理工作。
egrep = grep -E:擴充套件的正則表達式 (除了\< , \> , \b 使用其他正則都可以去掉\)
1.2.1 命令格式
1 |
|
1.2.2 命令功能
用於過濾/搜尋的特定字元。可使用正則表達式能多種命令配合使用,使用上十分靈活。
1.2.3 命令參數
常用參數已加粗
實戰演示
1:查詢指定進程和個數
[root@aly-centos7 /]# ps -ef | grep nginx
root 14475 14272 0 13:21 pts/0 00:00:00 grep --color=auto nginx
[root@aly-centos7 /]# ps -ef | grep -c nginx
1
檢視多個檔案相同的部分
檔案內容:
[root@aly-centos7 /]# cat passwd1
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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
[root@aly-centos7 /]# cat passwd2
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@aly-centos7 /]#cat passwd3
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
operator:x:11:0:operator:/root:/sbin/nologin
過濾結果:
[root@aly-centos7 /]# cat passwd1 | grep -f passwd2 | grep -f passwd3
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
operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]#
最後結果顯示三個檔案相同的部分
從單個和多個檔案查詢指定內容並顯示行號
[root@aly-centos7 /]# cat passwd2
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@aly-centos7 /]# cat passwd3
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
operator:x:11:0:operator:/root:/sbin/nologin
root,root
root123
[root@aly-centos7 /]# grep -n "root" passwd2
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]# grep -n "root" passwd2 passwd3
passwd2:1:root:x:0:0:root:/root:/bin/bash
passwd2:10:operator:x:11:0:operator:/root:/sbin/nologin
passwd3:1:root:x:0:0:root:/root:/bin/bash
passwd3:5:operator:x:11:0:operator:/root:/sbin/nologin
passwd3:6:root,root
passwd3:7:root123
[root@aly-centos7 /]#
指定字元查詢開頭,非開頭,結尾的內容
[root@aly-centos7 /]# grep "^r" passwd3 #查詢指定字元開頭
root:x:0:0:root:/root:/bin/bash
root,root
root123
[root@aly-centos7 /]# grep "^[^r]" passwd3 #查詢非指定字元開頭
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
operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]# grep "n$" passwd3 #查詢指定結尾
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
operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]#
過濾指定日誌裏面的ip個數
[root@aly-centos7 /]#cat qq.log | grep -c "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"
130205
過濾指定路徑下所以檔案裏面包含指定字元內容
[root@aly-centos7 /]# grep -r -n "root" /etc/
/etc/logrotate.d/ppp:9: create 0600 root root
/etc/logrotate.d/mysql:9:# In case the root user has a password, then you
/etc/logrotate.d/mysql:10:# have to create a /root/.my.cnf configuration file
/etc/logrotate.d/mysql:15:# user= root
/etc/logrotate.d/mysql:19:# ATTENTION: The /root/.my.cnf file should be readable
/etc/logrotate.d/mysql:20:# _ONLY_ by root !
/etc/logrotate.d/mysql-mmm:8: create 640 root adm
/etc/logrotate.d/wpa_supplicant:5: create 0600 root root
/etc/logrotate.d/yum:6: create 0600 root root
/etc/rsyncd.conf:9:# use chroot = yes
/etc/statetab:5:# See $STATE_LABEL in /etc/sysconfig/readonly-root
/etc/statetab:9:# /root
/etc/group:1:root:x:0:
/etc/group:49:dockerroot:x:991:
/etc/passwd-:1:root:x:0:0:root:/root:/bin/bash
/etc/passwd-:10:operator:x:11:0:operator:/root:/sbin/nologin
Binary file /etc/aliases.db matches
/etc/mime.types:351:application/vnd.cyan.dean.root+xml
/etc/mime.types:382:application/vnd.dvb.notif-aggregate-root+xml
(1)介紹
正則表達式應用廣泛,在絕大多數的程式語言都可以完美應用,在Linux中,也有着極大的用處。
使用正則表達式,可以有效的篩選出需要的文字,然後結合相應的支援的工具或語言,完成任務需求。
在本篇部落格中,我們使用grep/egrep來完成對正則表達式的呼叫
(2)正則表達式型別
正則表達式可以使用正則表達式引擎實現,正則表達式引擎是解釋正則表達式模式並使用這些模式匹配文字的基礎軟體。
在Linux中,常用的正則表達式有:
2.2.1 匹配字元
(1)格式
(2)演示
2.2.2 設定次數
(1)格式
(2)演示
2.2.3 位置錨定:定位出現的位置
(1)格式
(2)演示
2.2.4 分組和後向參照
(1)格式
① 分組:\(\) 將一個或多個字元捆綁在一起,當作一個整體進行處理
分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變數中,這些變數的命名方式爲: \1, \2, \3, ...
② 後向參照
參照前面的分組括號中的模式所匹配字元,而非模式本身
\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字元
\2 表示從左側起第2個左括號以及與之匹配右括號之間的模式所匹配到的字元,以此類推
\& 表示前面的分組中所有字元
③ 流程分析如下:
(2)演示
(1)字元匹配:
(2)位置錨定:
(3)總結
除了\<, \b : 語首、\>, \b : 語尾;使用其他正則都可以去掉\;上面有演示案例,不在進行演示
sed 是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱爲「模式空間」(patternspace ),接着用sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。然後讀入下行,執行下一個回圈。如果沒有使諸如‘D’ 的特殊命令,那會在兩個回圈之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出或-i。
功能:主要用來自動編輯一個或多個檔案, 簡化對檔案的反覆 反復操作
3.2.1 命令格式
1 |
|
3.2.2 常用選項options
3.2.3 地址定界
3.2.4 編輯命令command
3.3.1 常用選項options演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
3.3.2 地址界定演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
3.3.3 編輯命令command演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
(1)格式
(2)一個案例+示意圖演示
① 案例:倒序輸出文字內容
1 2 3 4 5 6 7 8 |
|
② 示意圖如下:
③ 總結模式空間與保持空間關係:
保持空間是模式空間一個臨時存放數據的緩衝區,協助模式空間進行數據處理
(3)演示
① 顯示偶數行
1 2 3 4 5 |
|
② 倒序顯示
1 2 3 4 5 6 7 8 9 10 |
|
③ 顯示奇數行
1 2 3 4 5 6 |
|
④ 顯示最後一行
1 2 |
|
⑤ 每行之間加空行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
⑥ 把每行內容替換成空行
1 2 3 4 5 6 7 8 9 10 11 |
|
⑦ 確保每一行下面 下麪都有一個空行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
sed實戰演示
查詢:
指定行區間查詢以root開頭的內容
[root@aly-centos7 /]# sed -n '1,5{/^root/p}' passwd2
root:x:0:0:root:/root:/bin/bash
[root@aly-centos7 /]#
匹配行之後增加顯示內容
[root@aly-centos7 /]# cat passwd3
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
operator:x:11:0:operator:/root:/sbin/nologin
root,root
root123
[root@aly-centos7 /]# sed -n '/3/,$p' passwd3 #顯示第一次匹配到的3到最行一行輸出
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root,root
root123
[root@aly-centos7 /]# sed -n '/3/,+1p' passwd3#顯示第一次匹配到的3到向下1行輸出
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root123
文字逆向排序輸出
[root@aly-centos7 /]# cat passwd2
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@aly-centos7 /]# sed '1!G;h;$!d' passwd2 #逆向排序
operator:x:11:0:operator:/root:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
顯示行號(空行也顯示)或(空行不顯示行號)
operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]#
[root@aly-centos7 /]# cat passwd2
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@aly-centos7 /]# sed '=' passwd2 #不遮蔽空行
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
6
sync:x:5:0:sync:/sbin:/bin/sync
7
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8
halt:x:7:0:halt:/sbin:/sbin/halt
9
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10
11
12
operator:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]# sed '/./=' passwd2 #遮蔽空行
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
6
sync:x:5:0:sync:/sbin:/bin/sync
7
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8
halt:x:7:0:halt:/sbin:/sbin/halt
9
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
12
operator:x:11:0:operator:/root:/sbin/nologin
顯示檔案總行數
[root@aly-centos7 /]# grep -n "" passwd3
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:operator:x:11:0:operator:/root:/sbin/nologin
6:root,root
7:root123
[root@aly-centos7 /]# sed -n '$=' passwd3
7
顯示偶數和奇數行
[root@aly-centos7 /]# grep -n "" passwd3
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:operator:x:11:0:operator:/root:/sbin/nologin
6:root,root
7:root123
[root@aly-centos7 /]# sed -n 'p;n' passwd3 #奇數行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root123
[root@aly-centos7 /]# sed -n '1~2p' passwd3 #奇數行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
root123
[root@aly-centos7 /]# sed -n 'n;p' passwd3 #偶數行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root,root
[root@aly-centos7 /]# sed -n '2~2p' passwd3 #偶數行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root,root
[root@aly-centos7 /]#
檔案中每行內容逆向顯示
[root@aly-centos7 /]# cat passwd2
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
1234567890
9876543210
[root@aly-centos7 /]# sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' passwd2
hsab/nib/:toor/:toor:0:0:x:toor
nigolon/nibs/:nib/:nib:1:1:x:nib
nigolon/nibs/:nibs/:nomead:2:2:x:nomead
nigolon/nibs/:mda/rav/:mda:4:3:x:mda
nigolon/nibs/:dpl/loops/rav/:pl:7:4:x:pl
cnys/nib/:nibs/:cnys:0:5:x:cnys
nwodtuhs/nibs/:nibs/:nwodtuhs:0:6:x:nwodtuhs%
tlah/nibs/:nibs/:tlah:0:7:x:tlah$
nigolon/nibs/:liam/loops/rav/:liam:21:8:x:liam$#
nigolon/nibs/:toor/:rotarepo:0:11:x:rotarepo
0987654321
0123456789
[root@aly-centos7 /]#
將數位按照「個十百」顯示
[root@aly-centos7 /]# cat passwd2
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
1234567890
9876543210
[root@aly-centos7 /]# sed ':a;s/\B[0-9]\{3\}\>/,&/;ta' passwd2
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
1,234,567,890
9,876,543,210
[root@aly-centos7 /]#
刪除:
刪除指定內容
刪除1-5行內容
[root@aly-centos7 /]# grep -n "" passwd2 | sed '1,5d'
6:sync:x:5:0:sync:/sbin:/bin/sync
7:%shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:$halt:x:7:0:halt:/sbin:/sbin/halt
9:#$mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:
11:
12:operator:x:11:0:operator:/root:/sbin/nologin
13:1234567890
14:9876543210
刪除奇數行:
[root@aly-centos7 /]# grep -n "" passwd2 | sed '1~2d'
2:bin:x:1:1:bin:/bin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
6:sync:x:5:0:sync:/sbin:/bin/sync
8:$halt:x:7:0:halt:/sbin:/sbin/halt
10:
12:operator:x:11:0:operator:/root:/sbin/nologin
14:9876543210
刪除空行
[root@aly-centos7 /]# grep -n "" passwd2
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
6:sync:x:5:0:sync:/sbin:/bin/sync
7:%shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:$halt:x:7:0:halt:/sbin:/sbin/halt
9:#$mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:
11:
12:operator:x:11:0:operator:/root:/sbin/nologin
13:1234567890
14:9876543210
[root@aly-centos7 /]# grep "" passwd2 | sed '/^$/d'
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
1234567890
9876543210
[root@aly-centos7 /]#
修改:
指定內容進行替換
將root全部替換成mysql
[root@aly-centos7 /]# grep -n "" passwd3
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:operator:x:11:0:operator:/root:/sbin/nologin
6:root,root
7:root123
[root@aly-centos7 /]# sed 's/root/mysql/g' passwd3
mysql:x:0:0:mysql:/mysql:/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
operator:x:11:0:operator:/mysql:/sbin/nologin
mysql,mysql
mysql123
把數位1全部替換成9
[root@aly-centos7 /]# sed 's/1/9/g' passwd3
root:x:0:0:root:/root:/bin/bash
bin:x:9:9:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
operator:x:99:0:operator:/root:/sbin/nologin
root,root
root923
只替換行中未出現「sbin」字元的時候,將」root「替換成」nginx「
[root@aly-centos7 /]# sed '/sbin/!s/root/nginx/g' passwd3
nginx:x:0:0:nginx:/nginx:/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
operator:x:11:0:operator:/root:/sbin/nologin
nginx,nginx
nginx123
root:x:11:0:operator:/root:/sbin/nologin
root1:x:11:0:operator:/root:/sbin/nologin
root2:x:11:0:operator:/root:/sbin/nologin
[root@aly-centos7 /]#
awk是一種程式語言,用於在linux/unix下對文字和數據進行處理。數據可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大程式設計工具。它在命令列中使用,但更多是作爲指令碼來使用。awk有很多內建的功能,比如陣列、函數等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
awk其實不僅僅是工具軟體,還是一種程式語言。不過,本文只介紹它的命令列用法,對於大多數場合,應該足夠用了。
4.2.1 語法
1 2 3 |
|
4.2.2 常用命令選項
變數:內建和自定義變數,每個變數前加 -v 命令選項
4.3.1 內建變數
(1)格式
(2)演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
4.3.2 自定義變數
自定義變數( 區分字元大小寫)
(1)-v var=value
① 先定義變數,後執行動作print
1 2 3 4 |
|
② 在執行動作print後定義變數
1 2 3 4 |
|
(2)在program 中直接定義
可以把執行的動作放在指令碼中,直接呼叫指令碼 -f
1 2 3 4 5 6 |
|
比print更強大
4.4.1 格式
(1)格式化輸出
1 |
|
① 必須指定FORMAT
② 不會自動換行,需要顯式給出換行控制符,\n
③ FORMAT 中需要分別爲後面每個item 指定格式符
(2)格式符:與item 一一對應
(3)修飾符:放在%c[/d/e/f...]之間
4.4.2 演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
4.5.1 格式
4.5.2 演示
(1)模式匹配符
1 2 3 4 5 6 7 8 9 10 11 |
|
(2)邏輯操作符
1 2 3 4 5 6 7 8 9 10 |
|
(3)條件表達式(三目表達式)
1 2 3 |
|
4.6.1 格式
PATTERN:根據pattern 條件,過濾匹配的行,再做處理
(1)如果未指定:空模式,匹配每一行
(2)/regular expression/ :僅處理能夠模式匹配到的行,正則,需要用/ / 括起來
(3)relational expression:關係表達式,結果爲「真」纔會被處理
真:結果爲非0值,非空字串
假:結果爲空字串或0值
(4)line ranges:行範圍
startline(起始行),endline(結束行):/pat1/,/pat2/ 不支援直接給出數位,可以有多段,中間可以有間隔
(5)BEGIN/END 模式
BEGIN{}: 僅在開始處理檔案中的文字之前執行一次
END{} :僅在文字處理完成之後執行
4.6.2 演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
(1)語法
1 2 |
|
(2)使用場景:對awk 取得的整行或某個欄位做條件判斷
(3)演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
(1)語法
1 |
|
注:條件「真」,進入回圈;條件「假」, 退出回圈
(2)使用場景
對一行內的多個欄位逐一類似處理時使用
對陣列中的各元素逐一處理時使用
(3)演示
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
(1)語法
1 |
|
意義:無論真假,至少執行一次回圈體
(2)計算1+2+3+...+100=5050
1 2 |
|
(1)語法
1 |
|
(2)特殊用法:遍歷陣列中的元素
1 |
|
(3)演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
5.5.1 switch語句
和shell中的case很像,就不在演示了
1 |
|
5.5.2 break和continue
1 2 3 4 5 6 |
|
5.5.3 next
next:提前結束對本行處理而直接進入下一行處理(awk 自身回圈)
1 2 3 4 |
|
5.6.1 關聯陣列:array[index-expression]
(1)可使用任意字串;字串要使用雙引號括起來
(2)如果某陣列元素事先不存在,在參照時,awk 會自動建立此元素,並將其值初始化爲「空串」
(3)若要判斷陣列中是否存在某元素,要使用「index in array」格式進行遍歷
(4)若要遍歷陣列中的每個元素,要使用for 回圈:for(var in array) {for-body}
5.6.2 演示
(1)awk使用陣列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
分析:把每行作爲下標,第一次進來,相當於print ias...一樣結果爲空,列印空,!取反結果爲1,列印本行,並且++變爲不空,下次進來相同的行就是相同的下標,本來上次的值,!取反爲空,不列印,++變爲不空,所以每次重複進來的行都不列印
(2)陣列遍歷
1 2 3 4 5 6 7 8 |
|
5.6.3 數值\字串處理
(1)數值處理
演示:
1 2 3 4 5 6 7 8 9 10 11 |
|
(2)字串處理:
演示:
1 2 3 4 5 6 7 8 9 10 |
|
(1)格式:和bash區別:定義函數()中需加參數,return返回值不是$?,是相當於echo輸出
1 2 3 4 |
|
(2)演示
1 2 3 4 5 6 7 8 |
|
(1)system 命令
空格是awk 中的字串連線符,如果system中需要使用awk中的變數可以使用空格分隔,或者說除了awk 的變數外其他一律用"" 參照 起來。
1 2 3 4 5 6 |
|
(2)awk 指令碼
將awk 程式寫成指令碼,直接呼叫或執行
範例:
1 2 3 4 5 6 7 8 |
|
(3)向awk指令碼傳遞參數
① 格式:
1 |
|
注意 :在BEGIN 過程 中不可用。直到 首行輸入完成以後,變數纔可用 。可以通過-v 參數,讓awk 在執行BEGIN 之前得到變數的值。命令列中每一個指定的變數都需要一個-v
② 範例
1 2 3 4 5 6 |
|
awk實戰
查詢:
列基本查詢
[root@aly-centos7 /]# awk '{print $0}' passwd4 #$0代表整列
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
1234 567890
9876 543210
[root@aly-centos7 /]# awk '{print $1}' passwd4 #$1代表第一列
root
bin
daemon
adm
lp
sync
%shutdown
$halt:x:7:0:halt:/sbin:/sbin/halt
#$mail
operator
1234
9876
當前記憶體過濾
首先要檢視剩餘記憶體是那個欄位標記,然後標記的這一行用grep取出來,最後用awk把這一行的列取出來在加上一個可讀性語句即可
[root@aly-centos7 /]# free | grep Mem | awk '{print"當前剩餘記憶體:\n",$7}'
當前剩餘記憶體:
1408424
[root@aly-centos7 /]#
存取ip過濾
/var/log/secure是用於記錄存取的資訊,可以通過這個日誌來看出來是否遭受到惡意攻擊
[root@aly-centos7 /]# grep "Accepted" /var/log/secure | awk '{print $11}'
101.95.130.134
101.95.130.134
101.95.130.134
101.95.130.134
101.95.130.134
101.95.130.134
101.95.130.134
101.95.130.134
[root@aly-centos7 /]#
通過過濾我就知道那些ip訪問了,不過存取的ip數量很多,而生產伺服器存取的ip都是固定的,一般都會有一個檔案記錄,這樣可以寫一個指令碼和你過濾的ip比對,那些沒有登記的就可以處理掉。
統計每行有多少列(NF)
[root@aly-centos7 /]# awk '{print NF}' passwd4
2
2
2
2
2
2
2
1
2
2
2
2
[root@aly-centos7 /]# cat passwd4
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
1234 567890
9876 543210
[root@aly-centos7 /]#
分別統計多個檔案有多少行(NFR)
[root@aly-centos7 /]# awk '{print FNR}' passwd3 passwd4
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
11
12
統計uid小於30的使用者有多少和大於30的餘戶有多少(判斷)
[root@aly-centos7 /]# awk -F: 'BEGIN{i=0;j=0}{if($3<=30){i++}else{j++}}END{print "<=30:"i,"\n",">=30:"j}' /etc/passwd
<=30:13
>=30:17
[root@aly-centos7 /]#
統計指定欄位出現的個數(while回圈)
[root@aly-centos7 /]# grep --color root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dockerroot:x:993:991:Docker User:/var/lib/docker:/sbin/nologin
[root@aly-centos7 /]# awk -F[:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd
5
統計ip出現的次數
[root@aly-centos7 httpd]# tail -10 access_log
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
172.16.163.69 - - [24/Jul/2018:13:39:12 +0800] "GET / HTTP/1.0" 403 4897 "-" "ApacheBench/2.3"
[root@aly-centos7 httpd]# awk '{ip[$1]++} END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_log
172.16.163.69 1000
grep 主要用於搜尋某些字串;
sed,awk 用於處理文字 ;
grep基本是以行爲單位處理文字的; 而awk可以做更細分的處理,通過指定分隔符將一行(一條記錄)劃分爲多個欄位,以欄位爲單位處理文字。awk中支援C語法,可以有分支條件判斷、回圈語句等,相當於一個小型程式語言。
awk功能比較多是一個程式語言了。 grep功能簡單,就是一個簡單的正則表達式的匹配。 awk的功能依賴於grep。
grep可以理解爲主要作用是在一個檔案中查詢過濾需要的內容。awk不是過濾查詢,而是文字處理工具,是把一個檔案處理成你想要的格式。
AWK的功能是什麼?與sed和grep很相似,awk是一種樣式掃描與處理工具。但其功能卻大大強於sed和grep。awk提供了極其強大的功能:它幾乎可以完成grep和sed所能完成的全部工作,同時,它還可以可以進行樣式裝入、流控制、數學運算子、進程控制語句甚至於內建的變數和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上,awk的確擁有自己的語言:awk程式設計語言,awk的三位建立者已將它正式定義爲:樣式掃描和處理語言。 使用awk的第一個理由是基於文字的樣式掃描和處理是我們經常做的工作,awk所做的工作有些象數據庫,但與數據庫不同的是,它處理的是文字檔案,這些檔案沒有專門的儲存格式,普通的人們就能編輯、閱讀、理解和處理它們。而數據庫檔案往往具有特殊的儲存格式,這使得它們必須用數據庫處理程式來處理它們。既然這種類似於數據庫的處理工作我們經常會遇到,我們就應當找到處理它們的簡便易行的方法,UNIX有很多這方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分優秀的一種。
使用awk的第二個理由是awk是一個簡單的工具,當然這是相對於其強大的功能來說的。的確,UNIX有許多優秀的工具,例如UNIX天然的開發工具C語言及其延續C++就非常的優秀。但相對於它們來說,awk完成同樣的功能要方便和簡捷得多。這首先是因爲awk提供了適應多種需要的解決方案:從解決簡單問題的awk命令列到複雜而精巧的awk程式設計語言,這樣做的好處是,你可以不必用複雜的方法去解決本來很簡單的問題。例如,你可以用一個命令列解決簡單的問題,而C不行,即使一個再簡單的程式,C語言也必須經過編寫、編譯的全過程。其次,awk本身是解釋執行的,這就使得awk程式不必經過編譯的過程,同時,這也使得它與shell script程式能夠很好的契合。最後,awk本身較C語言簡單,雖然awk吸收了C語言很多優秀的成分,熟悉C語言會對學習awk有很大的幫助,但awk本身不須要會使用C語言——一種功能強大但需要大量時間學習才能 纔能掌握其技巧的開發工具。
使用awk的第三個理由是awk是一個容易獲得的工具。與C和C++語言不同,awk只有一個檔案(/bin/awk),而且幾乎每個版本的UNIX都提供各自版本的awk,你完全不必費心去想如何獲得awk。但C語言卻不是這樣,雖然C語言是UNIX天然的開發工具,但這個開發工具卻是單獨發行的,換言之,你必須爲你的UNIX版本的C語言開發工具單獨付費(當然使用D版者除外),獲得並安裝它,然後你纔可以使用它。
基於以上理由,再加上awk強大的功能,我們有理由說,如果你要處理與文字樣式掃描相關的工作,awk應該是你的第一選擇。在這裏有一個可遵循的一般原則:如果你用普通的shell工具或shell script有困難的話,試試awk,如果awk仍不能解決問題,則便用C語言,如果C語言仍然失敗,則移至C++。
sed是一個非互動性文字流編輯器。它編輯檔案或標準輸入導出的文字拷貝。sed編輯器按照一次處理 一行的方式來處理檔案(或者輸入)並把輸出送到螢幕上。你可以在vi和ex/ed編輯器裡識別他的命令。sed把當前正在處理的行儲存在一個臨時快取裡,這個快取叫做模式空間。一但sed完成了對模式空間裡的行的處理(即對該行執行sed命令),就把模式空間的行送到螢幕上(除非該命令要刪除該行活禁止列印)。處理完該行之後,從模式空間裡刪除它,然後把下一行讀入模式空間,進行處理,並顯示。當輸入檔案的最後一行處理完後,sed終止。通過把每一行存在一個臨時快取裡並編輯該行,初始檔案不會被修改或被破壞。