-E:顯示行結束符$ -A:顯示全部控制符 -n:對顯示出的每一行進行編號 -b:非空行編號 -s:壓縮連續的空行成一行
[root06:13 PMcentos8 /tmp]#seq 5 |tac #行轉化 5 4 3 2 1 [root06:15 PMcentos8 /tmp]#echo "1 2 3 4 5" |rev 5 4 3 2 1 [root06:15 PMcentos8 /tmp]#echo "1 2 3 4 5" |tac 1 2 3 4 5 [root06:16 PMcentos8 /tmp]# [root06:16 PMcentos8 /tmp]#tac 3 4 56 7 7 56 4 3 ctrl +d 退出 [root06:19 PMcentos8 /tmp]#rev 123456789 987654321 ctrl +d 退出
[root06:46 PMcentos8 /tmp]#ls -lS /etc |head -3 total 1096 -rw-r--r--. 1 root root 692252 Apr 7 2020 services -rw-r--r--. 1 root root 22219 Jun 3 09:08 ld.so.cache -S 文件的大小排序
[root06:51 PMcentos8 /tmp]#tail -fn0 /var/log/messages #看到的都是最新的日誌 -f 跟蹤的是文件描述符。 跟蹤顯示文件fd新追加的內容,經常使用日誌監控,至關於 --follow=descriptor,當文件刪除再新建同名 文件,將沒法繼續跟蹤文件. -F 跟蹤文件名,至關於--follow=name --retry,當文件刪除再新建同名文件,將能夠繼續跟蹤文件
-d DELIMITER: 指明分隔符,默認tab -f FILEDS: #: 第#個字段,例如:3 #,#[,#]:離散的多個字段,例如:1,3,6 #-#:連續的多個字段, 例如:1-6 混合使用:1-3,7 -c 按字符切割 --output-delimiter=STRING指定輸出分隔符 [root@centos8 ~]#cut -d: -f1,3,7 --output-delimiter="---" /etc/passwd root---0---/bin/bash bin---1---/sbin/nologin daemon---2---/sbin/nologin [root07:06 PMcentos8 /tmp]#df|tr -s ' ' |cut -d' ' -f5 |tr -d % ( tr -s ' ' 壓縮空格) Use 0 0 3 df|tr -s ' ' '%'|cut -d% -f5 以%號爲分隔符
-d 分隔符:指定分隔符,默認用TABhtml
-s : 全部行合成一行顯示node
[root07:19 PMcentos8 /data]#cat seq.txt echo.txt 1 2 3 4 5 6 7 8 9 10 a b c d e f g h i j k [root07:20 PMcentos8 /data]#paste seq.txt echo.txt 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 10 j k [root07:20 PMcentos8 /data]#paste -s seq.txt 1 2 3 4 5 6 7 8 9 10 [root07:21 PMcentos8 /data]#paste -s seq.txt echo.txt 1 2 3 4 5 6 7 8 9 10 a b c d e f g h i j k [root07:21 PMcentos8 /data]#paste -sd: seq.txt echo.txt 1:2:3:4:5:6:7:8:9:10 a:b:c:d:e:f:g:h:i:j:k [root08:20 AMcentos8 ~]#seq 10 |paste -sd+ 1+2+3+4+5+6+7+8+9+10
wc 命令可用於統計文件的行總數、單詞總數、字節總數和字符總數 能夠對文件或STDIN中的數據統計 經常使用選項 -l 只計數行數 -w 只計數單詞總數 -c 只計數字節總數 -m 只計數字符總數 -L 顯示文件中最長行的長度 wc story.txt 39 237 1901 story.txt 行數 單詞數 字節數
-r 執行反方向(由上至下)整理 -R 隨機排序 -n 執行按數字大小整理 -f 選項忽略(fold)字符串中的字符大小寫 -u 選項(獨特,unique),合併重複項,即去重 -t c 選項使用c作爲字段界定符 -k # 選項按照使用c字符分隔的 # 列來整理可以使用屢次 [root07:31 PMcentos8 /data]#cut -d: -f1,3 /etc/passwd|sort -t: -k2 -nr |head -n3 nobody:65534 mysql:1006 git:1005 t: 冒號爲分隔符 k2 -nr 以第二列數字作比較 #隨機排序: [root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1 32 [root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1 38 [root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1 26 [root07:34 PMcentos8 /data]#seq 50 |sort -R |head -n1 #分區利用率: 壓縮空格變成百分號 [root07:35 PMcentos8 /data]#df| tr -s ' ' '%'|cut -d% -f5|sort -nr|head -1
-c: 顯示每行重複出現的次數 -d: 僅顯示重複過的行 -u: 僅顯示未曾重複的行
sort userlist.txt | uniq -c python
sort |uniq -c|sort -nr組合mysql
[root@centos8 data]#cut -d" " -f1 access_log |sort |uniq -c|sort -nr |head -3 4870 172.20.116.228 3429 172.20.116.208 2834 172.20.0.222 [root@centos8 ~]#ss -nt|tail -n +2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort - nr |head -n2 7 10.0.0.1 2 10.0.0.7
[root08:07 PMcentos8 /data]#diff -u f1.txt f2.txt --- f1.txt 2021-06-04 20:06:23.560480355 +0800 +++ f2.txt 2021-06-04 20:07:25.734158713 +0800 @@ -1,4 +1,5 @@ wangyu -liu -xue +liuge +wang xu +shi
[root08:12 PMcentos8 /data]#diff -u f1.txt f2.txt > f.patch [root08:15 PMcentos8 /data]#rm -f f2.txt [root08:15 PMcentos8 /data]#patch -b f1.txt f.patch -bash: patch: command not found [root08:15 PMcentos8 /data]#patch -b f1.txt f.patch patching file f1.txt [root08:16 PMcentos8 /data]#cat f1.txt #獲得的f2的內容 wangyu liuge wang xu shi [root08:16 PMcentos8 /data]#cat f1.txt.orig #獲得的是f1的內容 wangyu liu xue xu
一、找出ifconfifig 「網卡名」 命令結果中本機的IPv4地址linux
[root08:25 PMcentos8 /data]#ifconfig |head -2 |tr -s ' '|tail -1|cut -d' ' -f3 10.0.0.130
二、查出分區空間使用率的最大百分比值nginx
[root08:31 PMcentos8 /data]#df -h |tr -s ' ' '%' |cut -d"%" -f5 |tail -n +2 |sort -nr |head -1 8
三、查出用戶UID最大值的用戶名、UID及shell類型git
[root08:36 PMcentos8 /data]#sort -t: -k3 -nr </etc/passwd |head -1 |cut -d: -f1,3,7 --output-delimiter="---" nobody---65534---/sbin/nologin
四、查出/tmp的權限,以數字方式顯示web
[root08:38 PMcentos8 /data]#ll /tmp -d drwxrwxrwt. 9 root root 4096 Jun 4 20:22 /tmp 7777
五、統計當前鏈接本機的每一個遠程主機IP的鏈接數,並按從大到小排序正則表達式
[root08:40 PMcentos8 /data]#ss -nt|tail -n +2 |tr -s ' ' : |cut -d: -f6|sort|uniq -c|sort -nr |head -n2 2 10.0.0.1
基本正則表達式:BREsql
擴展正則表達式:ERE
. 匹配任意單個字符,能夠是一個漢字 (在通配符中.就表示一個點) [] 匹配指定範圍內的任意單個字符,示例:[wang] [0-9] [a-z] [a-zA-Z] [^] 匹配指定範圍外的任意單個字符,示例:[^wang] [:alnum:] 字母和數字 [:alpha:] 表明任何英文大小寫字符,亦即 A-Z, a-z [:lower:] 小寫字母,示例:[[:lower:]],至關於[a-z] [:upper:] 大寫字母 [:blank:] 空白字符(空格和製表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣) [:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...) [:digit:] 十進制數字 [:xdigit:]十六進制數字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 標點符號
* 匹配前面的字符任意次,包括0次,貪婪模式:儘量長的匹配 .* 任意長度的任意字符 \? 匹配其前面的字符0或1次,即:無關緊要 \+ 匹配其前面的字符至少1次,即:確定有,>=1 \{n\} 匹配前面的字符n次 \{m,n\} 匹配前面的字符至少m次,至多n次 \{,n\} 匹配前面的字符至多n次,<=n \{n,\} 匹配前面的字符至少n次
* 匹配前面字符任意次 ? 0或1次 + 1次或屢次 {n} 匹配n次 {m,n} 至少m,至多n次
[root@centos8 ~]#echo /etc/ |grep "/etc/\?" 0次或者1次 /etc/ [root@centos8 ~]#echo /etc |grep "/etc/\?" /etc
^ 行首錨定,用於模式的最左側 $ 行尾錨定,用於模式的最右側 ^PATTERN$ 用於模式匹配整行 ^$ 空行 ^[[:space:]]*$ 空白行 \< 或 \b 詞首錨定,用於單詞模式的左側 \> 或 \b 詞尾錨定,用於單詞模式的右側 \<PATTERN\> 匹配整個單詞
^ 行首 $ 行尾 \<, \b 語首 \>, \b 語尾
[root@centos8 ~]#grep -v '^$' /etc/profile|grep -v '^#' [root@centos6 ~]#grep -v '^#\|^$' /etc/httpd/conf/httpd.conf [root@centos6 ~]#grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf [root@centos6 ~]#grep "^[^#]" /etc/httpd/conf/httpd.conf # 不是#號開頭的行,中括號表示一個字符,將空行排除
a\|b #a或b C\|cat #C或cat \(C\|c\)at #Cat或cat
~~~是、
() 分組
後向引用:\1, \2, ...
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
![](D:\雲計算\7.文本編輯命令\08.jpg) ![](D:\雲計算\7.文本編輯命令\09.jpg) ![](D:\雲計算\7.文本編輯命令\10.jpg) ![08.jpg](https://s2.51cto.com/images/20210724/1627137554299128.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)![09.jpg](https://s2.51cto.com/images/20210724/1627137555497325.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)![10.jpg](https://s2.51cto.com/images/20210724/1627137555172613.jpg?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=) # 正則表達式練習 ~~~bash #顯示全部的正負數 - 也要轉義,懼怕是選項 ?表示0次或者1次 [root@centos8 ~]# echo -1 -12 123 466 |grep '\-\?[0-9]\+' -1 -12 123 466 # ifconfig取Ip [root@centos8 ~]# echo 11.002.11.112 |grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 11.002.11.11 ========================== [root@centos8 ~]# echo 11.002.11.1124 |grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 11.002.11.1124 =============================== [root@centos8 ~]# echo 1111.002.11.112 |grep '\<[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\>' [root@centos8 ~]# echo 111.002.11.112 |grep '\<[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\>' 111.002.11.112 ============================================= 拓展的正則表達式取IP [root@centos8 ~]# ifconfig |grep -E '\<([0-9]{1,3}\.){3}[0-9]{1,3}\>' inet 10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255 inet 127.0.0.1 netmask 255.0.0.0 [root@centos8 ~]# echo '\<([0-9]{1,3}\.){3}[0-9]{1,3}\>' >ip [root@centos8 ~]# cat ip \<([0-9]{1,3}\.){3}[0-9]{1,3}\> [root@centos8 ~]# ifconfig |egrep -f ip inet 10.0.0.130 netmask 255.0.0.0 broadcast 10.255.255.255 inet 127.0.0.1 netmask 255.0.0.0 ===================================== #表示0-199的兩位數: 要錨定 [root@centos8 ~]# echo 123 |grep -E '1?[0-9]{,2}' 前面是1開頭,後面是無關緊要的兩位數 123 [root@centos8 ~]# echo 223 |grep -E '1?[0-9]{,2}' 223 [root@centos8 ~]# echo 223 |grep -E '\<1?[0-9]{,2}\>' [root@centos8 ~]# echo 123 |grep -E '\<1?[0-9]{,2}\>' 123 [root@centos8 ~]# echo 1233 |grep -E '\<1?[0-9]{,2}\>' ========================================== grep -v "^[[:space:]] *#" nginx.conf | grep -v "^$" #號前面有空格也能夠過濾 #去除空行 -v排除 空行 [root@centos8 ~]# grep -v '^$' /etc/fstab 開頭不是空的 [root@centos8 ~]# grep '^[^$]' /etc/fstab #去除空行和帶#的行 [root@centos8 ~]# grep '^[^$#]' /etc/fstab UUID=9e5873df-59b2-44e2-939c-84aea45942bf / xfs defaults 0 0 UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot ext4 defaults 1 2 UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap swap defaults 0 0 ======================================== [root@centos8 ~]# grep '^[^$\|#]' /etc/fstab UUID=9e5873df-59b2-44e2-939c-84aea45942bf / xfs defaults 0 0 UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot ext4 defaults 1 2 UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap swap defaults 0 0 =========================================== [root@centos8 ~]# grep -E '^[^$|#]' /etc/fstab UUID=9e5873df-59b2-44e2-939c-84aea45942bf / xfs defaults 0 0 UUID=9647f29c-985e-4f9f-8fc8-3bf557cbe3ff /boot ext4 defaults 1 2 UUID=8a6b11db-b142-4b69-afea-02111bf91469 swap swap defaults 0 0 ========================================== [root10:47 AMcentos7 ]#grep -v '^$' /etc/fstab |grep -v '^#' /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 ======================================================================== [root11:39 AMcentos7 ]#grep ^[^#] /etc/fstab 由於中括號表示一個字符 /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root11:47 AMcentos7 ]#cat fstab # # /etc/fstab # Created by anaconda on Thu Apr 15 08:42:05 2021 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root11:47 AMcentos7 ]#grep ^[^#\|^$] /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root11:48 AMcentos7 ]#grep ^[^#] /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 ----------------------------------------------------------------------------------------- grep ^[^#\|^$] /etc/fstab grep ^[^#] /etc/fstab 兩條效果同樣 ---------------------------------------------------------------------------------------- ^在中括號裏面表示排除 ^在中括號外面表示開頭 單詞:數字、字母、下劃線的組合,其餘的是單詞的分隔符
:%s@^#\(.*\)@\1@ 或者 :%s@^#@@ 吧開頭的#號替換爲空
:%s/^UUID/#UUID/ :%s@^\(UUID\)@#\1@g
[root11:38 AMcentos7 ]#grep ^[^#] /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=ffe318c4-6b8c-49fc-a43a-7c15d622700e /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
一、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)
[root09:52 PMcentos8 /data]#grep -i ^s.* /proc/meminfo [root09:53 PMcentos8 /data]#grep ^[S\|s].* /proc/meminfo
二、顯示/etc/passwd文件中不以/bin/bash結尾的行
[root09:55 PMcentos8 /data]#grep -v '/bin/bash$' /etc/passwd
三、顯示用戶rpc默認的shell程序
[root10:00 PMcentos8 /data]#getent passwd rpc |cut -d: -f7 /bin/bash
四、找出/etc/passwd中的兩位或三位數
grep -E '^([1-9][0-9]|[1-9][0-9][0-9])$'
五、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面有非空白字符的行
方法一 grep -E ^[[:space:]].+[^' '] /etc/grub2.cfg 方法二 grep -E ^[[:space:]].+[^[:space:]] /etc/grub2.cfg 方法三 grep -E '^[[:space:]].+[^ ]' /etc/grub2.cfg
六、找出「netstat -tan」命令結果中以LISTEN後跟任意多個空白字符結尾的行
netstat -tan | grep 'LISTEN[[:space:]]*$'
七、顯示CentOS7上全部UID小於1000之內的用戶名和UID
[root11:45 PMcentos7 /data]#cat /etc/passwd |cut -d: -f1,3 |grep -E '\<[0-9]{1,3}\>' |sort -t: -k2
八、添加用戶bash、testbash、basher、sh、nologin(其shell爲/sbin/nologin),找出/etc/passwd用戶
名和shell同名的行
[root11:12 PMcentos8 /data]#grep -E '^(.*)\>.*\<\1$' /etc/passwd
九、利用df和grep,取出磁盤各分區利用率,並從大到小排序
[root10:42 PMcentos7 /data]#df |grep ^/dev/sd |tr -s ' ' '%' |cut -d% -f5 |sort -nr
grep 取Ip
[root10:57 PMcentos8 /data]#ifconfig ens33 |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1 10.0.0.130 # 點要轉意
. 匹配任意單個字符,能夠是一個漢字 .* 0次到無數次,至關於通配符裏的* [] 匹配指定範圍內的任意單個字符,示例:[wang] [0-9] [a-z] [a-zA-Z] [^] 匹配指定範圍外的任意單個字符,示例:[^wang] [:alnum:] 字母和數字 [:alpha:] 表明任何英文大小寫字符,亦即 A-Z, a-z [:lower:] 小寫字母,示例:[[:lower:]],至關於[a-z] [:upper:] 大寫字母 [:blank:] 空白字符(空格和製表符) [:space:] 水平和垂直的空白字符(比[:blank:]包含的範圍廣) [:cntrl:] 不可打印的控制字符(退格、刪除、警鈴...) [:digit:] 十進制數字 [:xdigit:]十六進制數字 [:graph:] 可打印的非空白字符 [:print:] 可打印字符 [:punct:] 標點符號 alias grep='grep --color=auto' .任意一個字符 ?0個或一個 + 一個以上 -q 靜默不輸出 隱藏信息 [root09:39 AMcentos7 ]#grep -iq Root /etc/fstab [root09:39 AMcentos7 ]#echo $? 0 -c 有多少行 包含root的行有多少 [root09:33 AMcentos7 ]#grep -c root /etc/passwd 2 包含ftp的行有多少 [root09:33 AMcentos7 ]#grep -c ftp /etc/passwd 1 -v 顯示不能被pattern匹配到的內容 -e 或者的關係 [root09:41 AMcentos7 ]#grep -e root -e bash /etc/passwd 或者: [root09:47 AMcentos7 ]#grep -E 'root|bash' /etc/passwd #且關係: [root09:49 AMcentos7 ]#grep bash /etc/passwd |grep root -E 擴展正則表達式,至關於egrep -i, --ignore-case 忽略字符大小寫 , 例如[sS]也能夠不區分大小寫 忽略大小寫匹配 [root09:36 AMcentos7 ]#grep -ci Ftp /etc/passwd 1 -o, --only-matching 僅僅顯示被匹配的字符自己,例如取IP,那麼可有可無的不要顯示了 [root10:54 AMcentos7 ]#df |grep '^/dev' |grep -o ' *[0-9]\{1,3\}%' 5% 10% -m# 匹配到的只顯示#行 -w 匹配整個單詞 [root@centos8 ~]#grep -w root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin -n 顯示匹配到的行行號 -A NUM, --after-context=NUM 顯示匹配到的行的後兩行 [root09:39 AMcentos7 ]#grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin [root09:41 AMcentos7 ]#grep -nA 2 root /etc/passwd 被匹配到的行的後兩行也顯示出來 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 -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin -B 匹配到的行的前行 -C 匹配到的行的先後行 -f 比較匹配,能夠取兩個文件的相同行 [root09:50 AMcentos7 ]#cat >t.txt<<eof > root > bash > eof [root09:56 AMcentos7 ]#grep -f t.txt /etc/passwd passwd文件裏面匹配t.txt的才配匹配 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin wang:x:1010:1010::/home/wang:/bin/bash hua:x:1011:1011::/home/hua:/bin/bash wanghua:x:1012:1012::/home/wanghua:/bin/bash wanghuahua:x:1013:1013::/home/wanghuahua:/bin/bash hello:x:1014:1014::/home/hello:/bin/bash huahua:x:1015:1015::/home/huahua:/bin/bash huahuahua:x:1016:1016::/home/huahuahua:/bin/bash user1:x:1017:1017::/home/user1:/bin/bash user2:x:1018:1018::/home/user2:/bin/bash user3:x:1019:1019::/home/user3:/bin/bash user4:x:1020:1020::/home/user4:/bin/bash user5:x:1021:1021::/home/user5:/bin/bash user6:x:1022:1022::/home/user6:/bin/bash user7:x:1023:1023::/home/user7:/bin/bash user8:x:1024:1024::/home/user8:/bin/bash user9:x:1025:1025::/home/user9:/bin/bash nginx:x:1027:1028::/home/nginx:/bin/bash public:x:1028:1029::/home/public:/bin/bash
常見選項: --color=auto 對匹配到的文本着色顯示 -m # 匹配#次後中止 [root08:54 PMcentos7 ~]#grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root08:56 PMcentos7 ~]#grep -m1 root /etc/passwd root:x:0:0:root:/root:/bin/bash -v 顯示不被pattern匹配到的行 -i 忽略字符大小寫 [root08:57 PMcentos7 ~]#grep -m1 -i Root /etc/passwd root:x:0:0:root:/root:/bin/bash -n 顯示匹配的行號 [root08:58 PMcentos7 ~]#grep -n -i Root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin -c 統計匹配的行數 [root08:58 PMcentos7 ~]#grep -c -i Root /etc/passwd 2 -o 僅顯示匹配到的字符串 [root08:59 PMcentos7 ~]#grep -o -i Root /etc/passwd root root root root -q 靜默模式,不輸出任何信息 找不找獲得都不輸出結果 -A # after, 後#行 [root08:59 PMcentos7 ~]#grep -nA2 root /etc/passwd 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 -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin -B # before, 前#行 [root09:03 PMcentos7 ~]#grep -nB2 root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin -C # context, 先後各#行 [root09:03 PMcentos7 ~]#grep -nC2 root /etc/passwd 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 -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin -e 實現多個選項間的邏輯or關係,如:grep –e ‘cat ’ -e ‘dog’ file -w 匹配整個單詞 [root09:10 PMcentos7 ~]#echo rooter |grep root rooter [root09:12 PMcentos7 ~]#echo rooter |grep -w root [root09:12 PMcentos7 ~]#echo root er |grep -w root root er -E 使用ERE,至關於egrep -F 不支持正則表達式,至關於fgrep -f file 根據模式文件處理 -r 遞歸目錄,但不處理軟連接 -R 遞歸目錄,但處理軟連接
yum -y install nmap [root@centos8 ~]# nmap -v -sP 10.0.0.0/24 |grep -B1 up |grep 'Nmap scan report for' |grep -Eo '[0-9.]+' > ip.txt 查詢到的結果追加到 ip.txt文件 Warning: The -sP option is deprecated. Please use -sn adjust_timeouts2: packet supposedly had rtt of -200686 microseconds. Ignoring time. [root@centos8 ~]# cat ip.txt 10.0.0.1 10.0.0.2 10.0.0.254 10.0.0.130 -C NUM, -NUM, --context=NUM 顯示匹配到的行的先後#行
-r 遞歸顯示,不處理軟鏈接 -R 遞歸顯示,處理軟鏈接 [root@centos8 ~]# grep -r 'root' /etc/*
[root@centos8 ~]#grep -v '^$' /etc/profile|grep -v '^#' [root@centos6 ~]#grep -v '^#\|^$' /etc/httpd/conf/httpd.conf [root@centos6 ~]#grep -v '^\(#\|$\)' /etc/httpd/conf/httpd.conf [root@centos6 ~]#grep "^[^#]" /etc/httpd/conf/httpd.conf
[13:02:34root@wanghua ~]#sort -t: -k3 -n /etc/passwd |tail -n1 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [13:02:58root@wanghua ~]#sort -t: -k3 -n /etc/passwd |tail -n1 |cut -d: -f1 nfsnobody
[13:07:34root@wanghua ~]#grep '^root\>' /etc/passwd root:x:0:0:root:/root:/bin/bash [13:07:46root@wanghua ~]#grep '^root\>' /etc/passwd |cut -d: -f7 /bin/bash [13:11:05root@wanghua ~]#id root &>/dev/null && grep '^root\>' /etc/passwd |cut -d: -f7 /bin/bash
[13:19:48root@wanghua ~]#netstat -tan |grep 'LISTEN[[:space:]]*$'
#先找到全部的用戶名 [13:30:44root@wanghua ~]#grep '^[[:alnum:]]\+\>' /etc/passwd #後項引用 [13:27:45root@wanghua ~]#grep '\(^[[:alnum:]]\+\>\).*\1$' /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
[13:36:05root@wanghua ~]#w |grep '^root\>' -q && echo 'root on login' ||echo "such user no login" root on login #若是不加\>那麼rooter 這樣的用戶也會顯示
[root@centos8 ~]#grep -v "^#" /etc/profile | grep -v '^$' [root@centos8 ~]#grep -v "^#\|^$" /etc/profile [root@centos8 ~]#grep -v "^\(#\|$\)" /etc/profile [root@centos8 ~]#grep -Ev "^(#|$)" /etc/profile [root@centos8 ~]#egrep -v "^(#|$)" /etc/profile [root@centos6 ~]#egrep -v '^(#|$)' /etc/httpd/conf/httpd.conf
[root@centos8 ~]#ifconfig eth0 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1 10.0.0.8
[root@centos8 ~]#grep "^\(.*\)\>.*\<\1$" /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 bash:x:1008:1008::/home/bash:/bin/bash nologin:x:1011:1011::/home/nologin:/sbin/nologin [root@centos8 ~]#grep -E "^(.*)\>.*\<\1$" /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 bash:x:1008:1008::/home/bash:/bin/bash nologin:x:1011:1011::/home/nologin:/sbin/nologin [root@centos8 ~]#egrep "^(.*)\>.*\<\1$" /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 bash:x:1008:1008::/home/bash:/bin/bash nologin:x:1011:1011::/home/nologin:/sbin/nologin
一、顯示三個用戶root、mage、wang的UID和默認shell
[root12:05 AMcentos7 /data]#grep -E "^root|wang|mage\>" /etc/passwd |cut -d: -f3,7 0:/bin/bash 1000:/bin/bash 1007:/bin/bash
二、找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行
[root12:55 AMcentos7 /data]#grep -E '^[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions
三、使用egrep取出/etc/rc.d/init.d/functions中其基名
[root11:53 PMcentos7 /data]#echo '/etc/rc.d/init.d/functions' |grep -Eo '[^/]+$' functions
四、使用egrep取出上面路徑的目錄名
[root11:57 PMcentos7 /data]#echo '/etc/rc.d/init.d/functions' |grep -Eo '^/.*/' /etc/rc.d/init.d/
五、統計last命令中以root登陸的每一個主機IP地址登陸次數
[root12:48 AMcentos7 /data]#last | egrep '^root' | egrep -o '([0-9]+\.){3}[0-9]+' |sort |uniq -c
六、利用擴展正則表達式分別表示0-九、10-9九、100-19九、200-24九、250-255
grep -E '[0-9]' grep -E '[1-9][0-9]' grep -E '1[0-9]{2}' grep -E '2[0-4][0-9]' grep -E '2[0-5][0-5]' 或者: grep -E '^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$'
七、顯示ifconfifig命令結果中全部IPv4地址
[root12:37 AMcentos7 /data]#ifconfig | grep -E -o '([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.[1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]){3}' 10.0.0.12 10.0.0.25 127.0.0.1 255.0.0.0
八、將此字符串:welcome to magedu linux 中的每一個字符去重並排序,重複次數多的排到前面
[root12:44 AMcentos7 /data]#echo 'welcome to magedu linux'|grep -o "."|sort|uniq -c|sort -nr 3 e 3 2 u 2 o 2 m 2 l 1 x 1 w 1 t 1 n 1 i 1 g 1 d 1 c 1 a
Sed是從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行,直到 最後一行。每當處理一行時,把當前處理的行存儲在臨時緩衝區中,稱爲模式空間(Pattern Space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下 一行,這樣不斷重複,直到文件末尾。一次處理一行的設計模式使得sed性能很高,sed在讀取大文件時 不會出現卡頓的現象。若是使用vi命令打開幾十M上百M的文件,明顯會出現有卡頓的現象,這是由於 vi命令打開文件是一次性將文件加載到內存,而後再打開。Sed就避免了這種狀況,一行一行的處理, 打開速度很是快,執行速度也很快
Stream EDitor,行編輯器 又稱流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時 緩衝區,稱爲"模式空間"(pattern space),接着用sed命令處理緩衝區中 的內容,處理完成後,把緩衝區的內容送往屏幕。而後讀入下一行,執行下 一個循環。 若是沒有使用諸如「D」的特殊命令,那會在兩個循環之間清空模式空間,但不 會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並無改變,除非 你使用重定向存儲輸出。 功能: 主要用來自動編輯一個或多個文件,簡化對文件的反覆操做,編寫轉換程序等
格式:
sed [option]... 'script;script;...' inputfile...
經常使用選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯
-f /PATH/SCRIPT_FILE 從指定文件中讀取編輯腳本
-r, -E 使用擴展正則表達式
-i.bak 備份文件並原處編輯
script**格式:**
'地址命令'
地址格式:
1. 不給地址:對全文進行處理 2. 單地址: #:指定的行,$:最後一行 /pattern/:被此處模式所可以匹配到的每一行 3. 地址範圍: #,# #從#行到第#行,3,6 從第3行到第6行 #,+# #從#行到+#行,3,+4 表示從3行到第7行 /pat1/,/pat2/ #,/pat/ 4. 步進:~ 1~2 奇數行 2~2 偶數行
命令:
p 打印當前模式空間內容,追加到默認輸出以後 Ip 忽略大小寫輸出 [root06:03 PMcentos8 ~]#sed -n '/Root/Ip' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin d 刪除模式空間匹配的行,並當即啓用下一輪循環 a [\\]text 在指定行後面追加文本,支持使用\n實現多行追加 i [\\]text 在行前面插入文本 c [\\]text 替換行爲單行或多行文本 w /path/file 保存模式匹配的行至指定文件 r /path/file 讀取指定文件的文本至模式空間中匹配到的行後 = 爲模式空間中的行打印行號 ! 模式空間中匹配行取反處理 s/pattern/string/修飾符 查找替換,支持使用其它分隔符,能夠是其它形式:s@@@,s### 替換修飾符: g 行內全局替換 p 顯示替換成功的行 w /PATH/FILE 將替換成功的行保存至文件中 I,i 忽略大小寫
[root@localhost data]# sed -n '/^Root/Ip' /etc/passwd root:x:0:0:root:/root:/bin/bash
#d :刪除模式空間中的內容 2d將編輯後的內容刪除了, -n 要原本該自動輸出的內容關閉了 [root@localhost data]# seq 10 |sed -n '2d' [root@localhost data]# seq 10 |sed '2d' 1 3 4 5 6 7 8 9 10 [root@localhost ~]# cat /etc/fstab -n 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Fri Dec 18 11:46:44 2020 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk/'. 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. 8 # 9 # After editing this file, run 'systemctl daemon-reload' to update systemd 10 # units generated from this file. 11 # 12 /dev/mapper/cl-root / xfs defaults 0 0 13 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 14 /dev/mapper/cl-swap swap swap defaults 0 0 刪除第1至第4行 若是加 -i 就修改原文件 [root@localhost ~]# sed '1,4d' /etc/fstab |cat -n 1 # 2 # Accessible filesystems, by reference, are maintained under '/dev/disk/'. 3 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. 4 # 5 # After editing this file, run 'systemctl daemon-reload' to update systemd 6 # units generated from this file. 7 # 8 /dev/mapper/cl-root / xfs defaults 0 0 9 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 10 /dev/mapper/cl-swap swap swap defaults 0 0 刪除指定的行 [root@localhost ~]# sed '4d' /etc/fstab 相對位置刪除行 從第三行開始一直刪除到第七行 [root@localhost ~]# sed '3,+4d' /etc/fstab #刪除全部以#開頭的行 [root@centos8 ~]#sed -i '/^#/d' fstab #只顯示非#開頭的行 [root@centos8 ~]#sed -n '/^#/!p' fstab #刪除第2和第4行 [root@centos8 ~]#sed -e '2d' -e '4d' seq.log [root@centos8 ~]#sed '2d;4d' seq.log #刪除的同時作備份 [root@centos8 ~]#sed -i.orig '2d;4d' seq.log
a \text 在行後追加文本text ,支持\n實現多行追加 [root@localhost data]# sed -n '/root/a line1' /etc/passwd line1 line1 [root@localhost data]# sed '/root/a line1' /etc/passwd root:x:0:0:root:/root:/bin/bash line1 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 line1 games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin 具體某一行後添加 [root@localhost ~]# sed '8a wanghua@@' /etc/fstab |cat -n 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Fri Dec 18 11:46:44 2020 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk/'. 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. 8 # 9 wanghua@@ 10 # After editing this file, run 'systemctl daemon-reload' to update systemd 11 # units generated from this file. 12 # 13 /dev/mapper/cl-root / xfs defaults 0 0 14 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 15 /dev/mapper/cl-swap swap swap defaults 0 0 轉義 [root@localhost ~]# sed '8a \"wanghua@@\"' /etc/fstab |cat -n 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Fri Dec 18 11:46:44 2020 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk/'. 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. 8 # 9 "wanghua@@" 10 # After editing this file, run 'systemctl daemon-reload' to update systemd 11 # units generated from this file. 12 # 13 /dev/mapper/cl-root / xfs defaults 0 0 14 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 15 /dev/mapper/cl-swap swap swap defaults 0 0 以UUID開頭的行後加內容 [root@localhost ~]# sed '/^UUID/a hello ' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 hello /dev/mapper/cl-swap swap swap defaults 0 0 [root@localhost ~]# 全部以數值結尾的行後加 [root@localhost ~]# sed '/[0-9]$/a huahua\nwangwang' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 huahua wangwang # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 huahua wangwang UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 huahua wangwang /dev/mapper/cl-swap swap swap defaults 0 0 huahua wangwang \n 換行 \t 水平風格符 靜默模式,只顯示添加的內容 [root@localhost ~]# sed '/[0-9]$/a huahua\nwangwang' /etc/fstab -n huahua wangwang huahua wangwang huahua wangwang huahua wangwang
加2行,多行
[root@localhost data]# sed '/root/a line1\nline2' /etc/passwd root:x:0:0:root:/root:/bin/bash line1 line2 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 line1 line2 games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos8 ~]#sed -i '/^listen 9527/a listen 80 \nlisten 8080' /etc/httpd/conf/httpd.conf #刪除全部以#開頭的行 [root@centos8 ~]#sed -i '/^#/d' fstab #只顯示非#開頭的行 [root@centos8 ~]#sed -n '/^#/!p' fstab #修改網卡配置 [root@centos8 ~]#sed -Ei.bak '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1 net.ifnames=0\2/' /etc/default/grub #顯示空行行號 [root08:49 AMcentos7 ]#sed -n '/^$/=' /etc/issue 3 [root08:50 AMcentos7 ]#cat /etc/issue \S Kernel \r on an \m [root08:50 AMcentos7 ]#
以/dev開頭的行前面加i++++++括號與/都轉義 [root@localhost ~]# sed '/^\/dev/i i++++++' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # i++++++ /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 i++++++ /dev/mapper/cl-swap swap swap defaults 0 0 [root@localhost ~]# sed '2i I teacher linux\n wang\nhua' /etc/fstab I teacher linux wang hua # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0 [root@localhost ~]#
#將line1這一行替換爲newline1 [root@localhost data]# cat 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 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 line1 line2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt [root@localhost data]# sed -i '/line1/c\newline1' passwd [root@localhost data]# cat 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 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 newline1 line2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt [root@localhost data]# sed -i '/halt/c\newline1' passwd #將含有halt的行替換爲newline1 [root@localhost data]# cat 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 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 newline1 line2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown newline1 pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin sssd:x:980:978:User for sssd:/:/sbin/nologin flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin
w 保存模式空間匹配到的行至指定文件中 [root@localhost data]# sed '/root/w root.log' passwd [root@localhost data]# cat root.log root:x:0:0:root:/root:/bin/bash #將/etc/fstab 中非#開頭的行保存到/tmp/fftmp文件中 [01:47:22root@localhost scripts]#sed '/^[^#]/w /tmp/fftmp' /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 19 11:49:26 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [01:48:00root@localhost scripts]#cat /tmp/fftmp /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 # 不加-n 就輸出之後保存 [01:48:25root@localhost scripts]#sed -n '/^[^#]/w /tmp/ffftmp' /etc/fstab [01:50:16root@localhost scripts]#cat /tmp/ffftmp /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0
[root@localhost data]# sed '/root/r /etc/issue' passwd root:x:0:0:root:/root:/bin/bash \S Kernel \r on an \m 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 newline1 line2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown newline1 pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin sssd:x:980:978:User for sssd:/:/sbin/nologin flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin
#取出非#開頭的行 p能夠寫到裏面或者外面 [11:25:55root@localhost ~]#sed -n '/^#/!p' /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [11:26:07root@localhost ~]#sed -n '/^#/!'p /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 #不是#開頭的行刪除 不是#號開頭的行被刪除了,沒有 -n 攔截,剩下的帶#的流出來 [11:30:55root@localhost ~]#sed '/^#/!d' /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 19 11:49:26 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # [11:31:01root@localhost ~]#sed '/^#/!'d /etc/fstab # # /etc/fstab # Created by anaconda on Mon Oct 19 11:49:26 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info #
[root@localhost data]# sed -n '/root/=' passwd 1 [root@localhost data]# sed '/root/=' passwd 1 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 newline1 line2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown newline1 pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin sssd:x:980:978:User for sssd:/:/sbin/nologin flatpak:x:979:977:User for flatpak system helper:/:/sbin/nologin
s/// 查找替換,分隔符能夠自行設定,經常使用的有s@@@ s### 替換標記: g 全局替換 w/PATH/TO/SOMEFILE 將替換的結果保存到指定文件中 p 顯示替換成功的行 #練習1 刪除 /etc/grub2.cfg 文件裏面全部以空白字符開頭的行的行首全部空白字符 [11:51:43root@localhost ~]#sed -r 's#^[[:space:]]+##' /etc/grub2.cfg 錯誤的答案是: [11:53:33root@localhost ~]#sed -r 's#^[[:space:]]+.*##' /etc/grub2.cfg #練習2 刪除/etc/fstab 目錄中全部以#開頭行的行首的#號,以及#號後面的空白字符 [12:03:24root@localhost ~]#sed -r 's@^#[[:space:]]*@@' /etc/fstab 多點編輯 UUID開頭的行也被刪除 [12:06:32root@localhost ~]#sed -re 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab 多點編輯 只是刪除UUID四個字符 (替換思想) [12:11:02root@localhost ~]#sed -re 's@^#[[:space:]]*@@' -e 's@^UUID@@' /etc/fstab
vim替換 :%S/AAA/BBB/g [root@localhost data]# sed -n '/root/s@r..t@admin@g' /etc/passwd [root@localhost data]# sed -n '/root/s@r..t@admin@gp' /etc/passwd admin:x:0:0:admin:/admin:/bin/bash [root@localhost ~]# sed -n '/root/s@r..t@admin@gpi' /etc/passwd admin:x:0:0:admin:/admin:/bin/bash operator:x:11:0:operator:/admin:/sbin/nologin -n 關閉自動打印 'p'匹配到的行打印出來 's' 搜索含有root的這一行 'g' 全局 i 忽略大小寫 / / 兩個/後接參數 不加 -n 重複打印一行UUID開頭的行 [root@localhost ~]# sed '/^UUID/p' /etc/fstab -n UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 -n:關閉自動打印 -n 配合-p 只打印匹配的行 [root@localhost ~]# sed '/^UUID/p' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0 替換: [root@localhost ~]# sed 's#UUID#吳樹麗#g' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 吳樹麗=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0 [root@localhost ~]# 前半部分支撐正則表達式,後半部分是什麼就寫什麼 [root@localhost ~]# sed -r 's#swap[ ]+defaults #hihi#' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap hihi 0 0 -r:拓展正則表達式 -E :同上 地址定界: 1 空地址:對全文處理 2 單地址: # :指定行 /pattern/ 被此模式匹配到的每一行 3 地址範圍: #,# 絕對地址 # +# 相對地址 #,/pat1/ 從指定的行開始,到一次可以被模式所匹配到的行結束之間的全部行 /pat1/,/pat2/ 4 指明步進 1~2 全部的奇數行 2~2 全部的偶數行 第14行替換 [root@localhost ~]# sed '14s#defaults#auto#p' /etc/fstab -n /dev/mapper/cl-swap swap swap auto 0 0 或者 sed '5,14s#defaults#auto#p' /etc/fstab -n 或者s@@@g 格式 i:忽略大小寫 [root@localhost ~]# sed '14s#defaults#auto#ip' /etc/fstab # # /etc/fstab # Created by anaconda on Fri Dec 18 11:46:44 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=35ea0a1b-3fa7-449d-a307-9bfba69807f5 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap auto 0 0 /dev/mapper/cl-swap swap swap auto 0 0 [root@localhost ~]# sed '14s#defaults#auto#ip' /etc/fstab -n /dev/mapper/cl-swap swap swap auto 0 0
[root@localhost data]# sed -n '/r..t/s@r..t@OK&@gp' passwd OKroot:x:0:0:OKroot:/OKroot:/bin/bash [root@localhost data]# sed -n '/r..t/s@r..t@&OK@gp' passwd rootOK:x:0:0:rootOK:/rootOK:/bin/bash 1.找到r..t的行 2.把裏面的r..t替換爲OKr..t
[12:21:25root@localhost ~]#echo '/etc/log/message' |sed -r 's@[^/]+$@@' 思想是把行尾的非斜線字符替換爲空的 [12:24:45root@localhost ~]#echo '/etc/log/message/' |sed -r 's@[^/]+\/?$@@' /etc/log/ [12:25:05root@localhost ~]#echo '/etc/log/message/' |sed -r 's@[^/]+/?$@@' 思想是加上 ?號保證斜線是無關緊要的 -r 選項之後無需轉義斜線 /etc/log/ [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?)$#\1#p' /etc/sysconfig [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?)$#\2#p' network-scripts/ [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#^(.*)\/([^/]+\/?$)#\2#p' network-scripts/ [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#\/(.*)\/([^/]+\/?$)#\2#p' network-scripts/ [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#(.*)\/([^/]+\/?$)#\2#p' network-scripts/ 基名不帶/ [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -nE 's#(.*)\/([^/]+)\/?$#\2#p' network-scripts ============ 或者不用正則表達式 [root@localhost ~]# echo /etc/sysconfig/network-scripts/ |sed -n 's#\(.*\)\/\([^/]\+\/\?$\)#\2#p' network-scripts/ 1 ([^/]+\/?)$ 或者([^/]+\/?$) 斜線結尾,前面非斜線的次數一次以上 2 \/ 斜線 3 ^(.*)任意內容開頭
[root@localhost ~]# echo a.b.c.gz |sed -n 's#(.*)\.([^.]+$)#\1#p' sed: -e expression #1, char 21: invalid reference \1 on `s' command's RHS [root@localhost ~]# echo a.b.c.gz |sed -nE 's#(.*)\.([^.]+$)#\1#p' a.b.c [root@localhost ~]# echo a.b.c.gz |sed -nE 's#(.*)\.([^.]+$)#\2#p' gz [root@localhost ~]# echo a.b.c.gz |sed -nr 's#(.*)\.([^.]+$)#\2#p' gz 1 [^.]+$ 結尾是非. 且次數一次以上 2 . 3 .* 任意內容 grep取 [root@localhost ~]# echo a.b.c.gz |grep -Eo '[^.]+$' gz [root@localhost ~]# echo a.b.c.gz |grep -Eo '.*\.' a.b.c. [root@localhost ~]# echo a.b.c.gz |grep -Eo '.*\.' |cut -d. -f1-3 a.b.c
方法一: [root@localhost ~]# ifconfig ens32 |sed -n '2p' inet 10.0.0.147 netmask 255.255.255.0 broadcast 10.0.0.255 [root@localhost ~]# ifconfig ens32 |sed -n '2p'|sed 's#.*inet##g' 10.0.0.147 netmask 255.255.255.0 broadcast 10.0.0.255 [root@localhost ~]# ifconfig ens32 |sed -n '2p'|sed 's#.*inet##g'|sed 's#net.*##' 10.0.0.147 方法二: [root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##' [root@localhost ~]# [root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' 10.0.0.147 netmask 255.255.255.0 broadcast 10.0.0.255 [root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##p' 10.0.0.147 10.0.0.147 [root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##p' -n 10.0.0.147 替換爲空要打印出來 [root@localhost ~]# ifconfig ens32 |sed -n '2s#.*inet##p' |sed 's#net.*##' 10.0.0.147 [root@localhost ~]# ifconfig ens32 |sed -nE '2s#^[^0-9]+([0-9.]{7,15}).*#\1#p' 10.0.0.147 [root@localhost ~]# ifconfig ens32 |sed -ne '2s#.*inet##' -e 's#netmas.*##p' 10.0.0.147
[root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/" 401.rmvb [root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/" 3118.rmvb [root@localhost ~]# echo |sed "s/^/$RANDOM.rmvb/" 4625.rmvb [root@localhost ~]# echo |sed 's/^/$RANDOM.rmvb/' $RANDOM.rmvb [root@localhost ~]# echo |sed 's/^/'''$RANDOM'''.rmvb/' 18126.rmvb [root@localhost ~]# echo |sed 's/^/'''$RANDOM'''.rmvb/' 31500.rmvb
sed ' ' 至關於 cat
-n 'p' 只打印一份,關閉默認打印,不重複打印
-n '3p' 只打印第3行
[root05:25 PMcentos8 ~]#sed -n '$p' /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin [root05:35 PMcentos8 ~]#tail -n1 /etc/passwd apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
[root05:40 PMcentos8 ~]#grep '^[^#]' /etc/fstab
[root05:40 PMcentos8 ~]#sed -n '/^[^#]/p' /etc/fstab
#包含root 的行 [root05:44 PMcentos8 ~]#sed -n '/root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root05:45 PMcentos8 ~]#grep 'root' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #以root開頭的行 [root05:44 PMcentos8 ~]#sed -n '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash [root05:46 PMcentos8 ~]#grep '^root' /etc/passwd root:x:0:0:root:/root:/bin/bash
#打印從第幾行到第幾行 [root05:46 PMcentos8 ~]#nl /etc/passwd |sed -n '3,6p' 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 [root05:50 PMcentos8 ~]#nl /etc/passwd |sed -n '3,+1p' 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin
#模式匹配 [root05:55 PMcentos8 ~]#sed -n '/^d/,/^s/p' /etc/passwd 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 dbus:x:81:81:System message bus:/:/sbin/nologin systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
#打印最後一行 [root08:24 AMcentos7 ]#sed -n '$p' /etc/passwd public:x:1028:1029::/home/public:/bin/bash #打印非#開頭的行,p能夠寫到模式空間裏面或者外面都沒有錯 [11:19:37root@localhost ~]#sed -n '/^[^#]/'p /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [11:21:33root@localhost ~]#sed -n '/^[^#]/p' /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=0072ccb1-47b2-4081-97f6-7ffbe11ed5b2 /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 [root@centos8 ~]#seq 10 | sed -n '3,+4p' 34567 [root@centos8 ~]#seq 10 | sed -n '3,$p' 345678
#打印不包含UUIDt的行 [root06:10 PMcentos8 ~]#sed '/UUID/d' /etc/fstab [root06:12 PMcentos8 ~]#sed -n '/UUID/!p' /etc/fstab [root06:14 PMcentos8 ~]#sed -n '/UUId/I!p' /etc/fstab
[root@localhost data]# sed '' </etc/fstab # # /etc/fstab # Created by anaconda on Sat Nov 21 03:07:38 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/cl-root / xfs defaults 0 0 UUID=23a00316-a763-4b59-9c6a-42bd27f4e7c1 /boot ext4 defaults 1 2 /dev/mapper/cl-swap swap swap defaults 0 0
[root@localhost data]# sed -n '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash [root@localhost data]# sed '/^root/p' /etc/passwd root:x:0:0:root:/root:/bin/bash 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 daemons:/run/gluster:/sbin/nologin chrony:x:993:988::/var/lib/chrony:/sbin/nologin setroubleshoot:x:992:986::/var/lib/setroubleshoot:/sbin/nologin pipewire:x:991:985:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin saslauth:x:990:76:Saslauthd user:/run/saslauthd:/sbin/nologin dnsmasq:x:984:984:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin radvd:x:75:75:radvd user:/:/sbin/nologin -n 關閉自動打印
[root05:39 PMcentos8 ~]#seq 10 |sed '5a abc' 1 2 3 4 5 abc 6 7 8 9 10 [root06:17 PMcentos8 ~]#seq 10 |sed '5aabc' 1 2 3 4 5 abc 6 7 8 9 10 root06:17 PMcentos8 ~]#seq 10 |sed '5 aabc' 1 2 3 4 5 abc 6 7 8 9 10 [root06:23 PMcentos8 ~]#seq 10 |sed '5a\ abc\ndef' 1 2 3 4 5 abc def 6 7 8 9 10 [root06:17 PMcentos8 ~]#seq 10 |sed '5,8aabc' 1 2 3 4 5 abc 6 abc 7 abc 8 abc 9 10 [root06:23 PMcentos8 ~]#seq 10 |sed '5i\ abc\ndef' 1 2 3 4 abc def 5 6 7 8 9 10 [root06:24 PMcentos8 ~]#seq 10 |sed '5c\ abc\ndef' 1 2 3 4 abc def 6 7 8 9 10
[root06:25 PMcentos8 ~]#seq 10 |sed -e '5aabc' -e '5iefg' 1 2 3 4 efg 5 abc 6 7 8 9 10
#以b開頭的行 [root06:33 PMcentos8 ~]#sed -n '/^b/w /data/b.log' /etc/passwd [root06:34 PMcentos8 ~]#cat /data/b.log bin:x:1:1:bin:/bin:/sbin/nologin #第三行寫入到文件 [root06:35 PMcentos8 ~]#sed -n '3w /data/b.log' /etc/passwd [root06:36 PMcentos8 ~]#cat /data/b.log daemon:x:2:2:daemon:/sbin:/sbin/nologin #區間 [root06:35 PMcentos8 ~]#sed -n '3,6w /data/b.log' /etc/passwd
[root06:36 PMcentos8 ~]#seq 10 |sed '3r /etc/issue' 1 2 3 \S Kernel \r on an \m 4 5 6 7 8 9 10 [root06:41 PMcentos8 ~]#seq 10 |sed '3,6r /etc/issue' 1 2 3 \S Kernel \r on an \m 4 \S Kernel \r on an \m 5 \S Kernel \r on an \m 6 \S Kernel \r on an \m 7 8 9 10
#刪除包含root的行 [root06:56 PMcentos8 /data]#ls b.log passwd [root06:56 PMcentos8 /data]#sed -i.bak '/root/d' passwd [root06:57 PMcentos8 /data]#sed -n '/root/p' passwd [root06:57 PMcentos8 /data]# #修改用戶名 [root07:02 PMcentos8 /data]#sed -i.bak -e '/^User apache/cUser daemon' -e '/^Group apache/cGroup daemon' /etc/httpd/conf/httpd.conf [root07:39 PMcentos8 /data]#sed -iE -e 's#^User .*#User apache #g' -e 's#Group .*#Group apache#g' /etc/httpd/conf/httpd.conf #修改selinux [root07:10 PMcentos8 /data]#sed -i.bak '/SELINUX=enforcing/cSELINUX=disabled' /etc/sysconfig/selinux [root07:39 PMcentos8 /data]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux.bak #修改網卡名字 [root08:15 PMcentos8 ~]#cat /etc/default/grub GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet" GRUB_DISABLE_RECOVERY="true" GRUB_ENABLE_BLSCFG=true #掐頭去尾,中間加內容 [root08:19 PMcentos8 ~]#sed -Ei '/^GRUB_CMDLINE_LINUX/s/(.*)(")$/\1 net.ifnames=0 \2/' /etc/default/grub [root08:15 PMcentos8 ~]#sed -Ei '/^GRUB_CMDLINE_LINUX/s/(.*)"$/\1 net.ifnames=0"/' /etc/default/grub
P 打印模式空間開端至\n內容,並追加到默認輸出以前 h 把模式空間中的內容覆蓋至保持空間中 H 把模式空間中的內容追加至保持空間中 g 從保持空間取出數據覆蓋至模式空間 G 從保持空間取出內容追加至模式空間 x 把模式空間中的內容與保持空間中的內容進行替換 n 讀取匹配到的行的下一行覆蓋至模式空間 N 讀取匹配到的行的下一行追加至模式空間 d 刪除模式空間中的行 D 若是模式空間中包含換行符,則刪除知道第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間從新啓動循環。若是模式空間 不包含換行符,則會像發出d命令那樣啓動正常的新循環 H h爲存 G g 爲取 如沒有存,則取爲空行 ============================================================= sed -n 'n;p'file 打印偶數行 sed '1!G;h;$!d' 漢諾塔 倒序顯示 至關於 tac sed 'N;D' file 只顯示了最後一行至關於 sed -n '$p' f1 sed '$!N;$!D' file 顯示了最後兩行 sed '$!d' file 顯示了最後一行 sed 'G' file 每一行後都加上空行 sed '/part/g' file 指定行替換爲空行 sed '/^$/d;G' file 刪除空行以後每一行以後都加空行 sed 'n;d' file 刪除偶數行(只顯示奇數行) sed 'n;n;d' file 刪除3的倍數行,從第3行開始 sed '1~3d' file 從第1行開始,隔2行刪除1行 顯示奇數行 seq 10 | sed '2~2d' seq 10 | sed -n '1~2p' seq 10 | sed 'n;d' 顯示偶數行 seq 10 | sed '1~2d' seq 10 | sed -n '2~2p' seq 10 | sed -n 'n;p' h 將pattern space中的內容拷貝到hold space中,原來的hold space裏的內容被清除 H 將pattern space中的內容追加到hold space g 將hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除 G 將hold space中的內容追加到pattern space x:交換保持空間和模式空間的內容 n:表示讀取匹配到的行的下一行覆蓋到pattern中 N:表示讀取匹配到的行的下一行追加到pattern中 d 刪除模式空間中的行 D 刪除多行模式空間中的全部行 sed -n 'n;p' FILE:顯示偶數行; sed '1!G;h;$!d' FILE:逆序顯示文件的內容; sed ’$!d' FILE:取出最後一行; sed '$!N;$!D' FILE:取出文件後兩行; sed '/^$/d;G' FILE:刪除原有的全部空白行,然後爲全部的非空白行後添加一個空白行; sed 'n;d' FILE:顯示奇數行; sed 'G' FILE:在原有的每行後方添加一個空白行;
練習: 一、刪除centos7系統/etc/grub2.cfg文件中全部以空白開頭的行行首的空白字符 [root10:35 PMcentos7 ~]#sed -r 's@^([[:space:]]*)@@g' /etc/grub2.cfg 二、刪除/etc/fstab文件中全部以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符 [root08:22 AMcentos7 /misc/cd/Packages]# sed -r 's/^#[[:space:]]+//' /etc/fstab 三、在centos6系統/root/install.log每一行行首增長#號 [root@localhost ~]# sed -r 's/^/#/' /root/install.log 四、在/etc/fstab文件中不以#開頭的行的行首增長#號 [root@localhost ~]# sed -r 's/^[^#](.*)/#\1/' /etc/fstab [root@localhost ~]# sed -r 's/.*/#&/' /root/install.log 五、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名 [root@localhost ~]# echo '/etc/fstab'| sed -r 's#.*/([^/]/?)#\1#' fstab [root@localhost ~]# echo '/etc/fstab' |sed -r 's/(.*\/).*/\1/' /etc/ 六、利用sed 取出ifconfig命令中本機的IPv4地址 root11:16 PMcentos8 ~]#ifconfig | sed -r -e '2!d' -e 's/^[^0-9]+([0-9.]+) .*/\1/' 10.0.0.130 [root@localhost ~]# ifconfig eth0 |sed '2!d'|sed -r 's/^[^0-9]+([0-9.]+) .*/\1/' 10.0.0.6 七、統計centos安裝光盤中Package目錄下的全部rpm文件的以.分隔倒數第二個字段的重複次數 [root07:00 AMcentos7 /misc/cd/Packages]#ls |grep "rpm" |sed -r 's#.*\.(.*)\.rpm$#\1#' |sort |uniq -c 1405 noarch 八、統計/etc/init.d/functions文件中每一個單詞的出現次數,並排序(用grep和sed兩種方法分別實現) [root08:06 AMcentos7 /misc/cd/Packages]#sed -r 's#[^[:alpha:]]#\n#g' /etc/init.d/functions |sed -r '/^$/d'|sort|uniq -c |sort -n [root08:11 AMcentos7 /misc/cd/Packages]#grep -Eo '[[:alpha:]]+' /etc/init.d/functions |sort |uniq -c|sort -n [root08:15 AMcentos7 /misc/cd/Packages]#tr -c "[[:alpha:]]" '\n' < /etc/init.d/functions |sort|uniq -c|sort -n 九、將文本文件的n和n+1行合併爲一行,n爲奇數行 方法一 sed -n 'N;s/\n/ /p' f1 方法二 cat f1 |xargs -n2
格式:
awk [options] 'program' var=value file… awk [options] -f programfile var=value file…
說明:
program一般是被放在單引號中,並能夠由三種部分組成
BEGIN語句塊
模式匹配的通用語句塊
END語句塊
常見選項:
-F 「分隔符」 指明輸入時用到的字段分隔符,默認的分隔符是若干個連續空白符
-v var=value 變量賦值
pattern:決定動做語句什麼時候觸發及觸發事件,好比:BEGIN,END,正則表達式等
action statements:對數據進行處理,放在{}內指明,常見:print, printf
[root@centos8 ~]#awk '{print "hello,awk"}' [root@centos8 ~]#seq 10 | awk '{print "hello,awk"}' hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk [root@centos8 ~]#seq 3 | awk '{print 2*3}' 6 6 6 [root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd #有多少行就打印多少個wang [root@centos8 ~]#awk -F: '{print}' /etc/passwd [root@centos8 ~]#awk -F: '{print $0}' /etc/passwd [root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd [root@centos8 ~]#awk -F: '{print $1"\t"$3}' /etc/passwd [root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print $2,$3'} / xfs /boot ext4 /data xfs swap swap
FS:輸入字段分隔符,默認爲空白字符,功能至關於 -F awk -v FS=':' '{print $1,FS,$3}' /etc/passwd awk -v FS=":" '{print $1FS$3}' /etc/passwd awk –F: '{print $1,$3,$7}' /etc/passwd S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd [root@centos8 ~]#awk -v FS=":" '{print $1FS$3}' /etc/passwd |head -n3 root:0 bin:1 daemon:2 [root@centos8 ~]#S=:;awk -F$S '{print $1,$3}' /etc/passwd|head -n3 root 0 bin 1 daemon 2 [root@centos8 ~]# #-F 和 FS變量功能同樣,同時使用會衝突 [root@centos8 ~]#awk -v FS=":" -F";" '{print $1FS$3}' /etc/passwd |head -n3 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@centos8 ~]#awk -F";" -v FS=":" '{print $1FS$3}' /etc/passwd |head -n3 root:0 bin:1 daemon:2 [root@centos8 ~]#
OFS:輸出字段分隔符,默認爲空白字符 [root@centos8 ~]#awk -v FS=':' '{print $1,$3,$7}' /etc/passwd|head -n1 root 0 /bin/bash [root@centos8 ~]#awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd|head -n1 root:0:/bin/bash
RS:輸入記錄record分隔符,指定輸入時的換行符 awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:輸出記錄分隔符,輸出時用指定符號代替換行符 awk -v RS=' ' -v ORS='###' '{print $0}' /etc/passwd
NF:字段數量 #引用變量時,變量前不需加$ [root@centos8 ~]#awk -F: '{print NF}' /etc/passwd #打印每一行有多少字段 [root@centos8 ~]#awk -F: '{print $(NF-1)}' /etc/passwd #打印每一行的倒數第二段 [root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." '{print $(NF- 1)}'|sort |uniq -c 389 i686 208 noarch 1060 x86_64
NR:記錄的編號 [root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/centos-release 1 \S 2 Kernel \r on an \m 3 4 CentOS Linux release 8.1.1911 (Core) 取ifconfig輸出結果中的IP地址 [root@centos8 ~]#ifconfig eth0 | awk '/netmask/{print $2}' 10.0.0.8 [root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}' 10.0.0.8 [root@centos8 ~]#awk -F: '{print NR}' /etc/passwd 打印每一行的行號 1 2 3 ....... [root@centos8 ~]#awk -F: 'END{print NR}' /etc/passwd 57 [root@centos8 ~]#awk -F: 'BEGIN{print NR}' /etc/passwd 0
FNR:各文件分別計數,記錄的編號 awk '{print FNR}' /etc/fstab /etc/inittab [root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/redhat-release 1 \S 2 Kernel \r on an \m 34 CentOS Linux release 8.0.1905 (Core) [root@centos8 script40]#awk '{print FNR,$0}' /etc/issue /etc/redhat-release 1 \S 2 Kernel \r on an \m 31 CentOS Linux release 8.0.1905 (Core)
FILENAME:當前文件名 [root@centos8 ~]#awk '{print FILENAME}' /etc/fstab [root@centos8 ~]#awk '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release 1 /etc/issue \S 2 /etc/issue Kernel \r on an \m 3 /etc/issue 1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)
ARGC:命令行參數的個數 [root@centos8 ~]#awk '{print ARGC}' /etc/issue /etc/redhat-release 3 3 3 3 [root@centos8 ~]#awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release 3
ARGV:數組,保存的是命令行所給定的各參數,每個參數:ARGV[0],...... 範例 [root@centos8 ~]#awk 'BEGIN{print ARGV[0]}' /etc/issue /etc/redhat-release awk [root@centos8 ~]#awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/redhat-release /etc/issue [root@centos8 ~]#awk 'BEGIN{print ARGV[2]}' /etc/issue /etc/redhat-release /etc/redhat-release [root@centos8 ~]#awk 'BEGIN{print ARGV[3]}' /etc/issue /etc/redhat-release [root@centos8 ~]#
[root11:17 AMcentos8 ~]#awk -v test='hello' '{print test}' /etc/passwd # passwd有多少行就打印多少個hello [root11:20 AMcentos8 ~]#awk -v test='hello' 'BEGIN{print test}' /etc/passwd #不重複打印 hello [root11:24 AMcentos8 ~]#awk -F: '{sex="male";print $1,sex,age;age=18}' /etc/passwd cat awkscript {print script,$1,$2} awk -F: -f awkscript script="awk" /etc/passwd
逗號分隔符
輸出item能夠字符串,也但是數值;當前記錄的字段、變量或awk的表達式
如省略item,至關於print $0
固定字符符須要用「 」 引發來,而變量和數字不須要
printf 能夠實現格式化輸出 printf 「FORMAT」, item1, item2, ... 說明: 必須指定FORMAT 不會自動換行,須要顯式給出換行控制符 \n FORMAT中須要分別爲後面每一個item指定格式符 格式符:與item一一對應 %c:顯示字符的ASCII碼 %d, %i:顯示十進制整數 %e, %E:顯示科學計數法數值 %f:顯示爲浮點數 %g, %G:以科學計數法或浮點形式顯示數值 %s:顯示字符串 %u:無符號整數 %%:顯示%自身 #修飾符 #[.#] 第一個數字控制顯示的寬度;第二個#表示小數點後精度,如:%3.1f - 左對齊(默認右對齊) 如:%-15s + 顯示數值的正負符號 如:%+d
[root11:44 AMcentos8 ~]#awk -F: '{printf "username: %-25sUID:%d\n",$1,$3}' /etc/passwd
算術操做符:
x+y, x-y, x*y, x/y, x^y, x%y -x:轉換爲負數 +x:將字符串轉換爲數值
字符串操做符:沒有符號的操做符,字符串鏈接
賦值操做符:
=, +=, -=, *=, /=, %=, ^=,++, --
[root04:39 PMcentos7 ~]#awk -v n=0 '!n++' /etc/passwd root:x:0:0:root:/root:/bin/bash [root04:39 PMcentos7 ~]#awk -v n=1 '!n++' /etc/passwd [root04:39 PMcentos7 ~]#awk 'BEGIN{i=0;print ++i,i}' /etc/passwd 1 1 [root04:41 PMcentos7 ~]#awk 'BEGIN{i=0;print i++,i}' /etc/passwd 0 1
==, !=, >, >=, <, <=
[root05:32 PMcentos7 ~]#seq 10 |awk 'NR%2==0' 2 4 6 8 10 [root05:32 PMcentos7 ~]#seq 10 |awk 'NR%2!=0' 1 3 5 7 9
[root05:37 PMcentos7 ~]#awk -F":" '$0 !~/root/{print $1}' /etc/passwd 取反 bin
[root05:41 PMcentos7 ~]#df | awk -F"[[:space:]]+|%" '$0 ~ /^\/dev\/sd/{print $5}' 8 8 1 1
[root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}' 10.0.0.8
awk -F: '$3>=0 && $3<=1000 {print $1,$3}' /etc/passwd awk -F: '$3==0 || $3>=1000 {print $1,$3}' /etc/passwd awk -F: '!($3==0) {print $1,$3}' /etc/passwd awk -F: '!($3>=500) {print $1,$3}' /etc/passwd
selector?if-true-expression:if-false-expression [root06:01 PMcentos7 ~]#awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf "%-10s %35s\n", $1,usertype}' /etc/passwd
PATTERN:根據pattern條件,過濾匹配的行,再作處理
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
[root@centos8 ~]#awk '/^UUID/{print $1}' /etc/fstab [root@centos8 ~]#awk '!/^UUID/{print $1}' /etc/fstab [root@centos8 ~]#df | awk '/^\/dev\/sd/' /dev/sda2 104806400 4935924 99870476 5% / /dev/sda3 52403200 398876 52004324 1% /data /dev/sda1 999320 848572 81936 92% /boot
relational expression: 關係表達式,結果爲「真」纔會被處理
真:結果爲非0值,非空字符串
假:結果爲空字符串或0值
[root06:09 PMcentos7 ~]# [root06:09 PMcentos7 ~]#awk '"0"' /etc/issue #0被當作字符串了 \S Kernel \r on an \m
Awk -F: '$3>=1000{print $1,$3}' /etc/passwd awk -F: '$3<1000{print $1,$3}' /etc/passwd awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd [root@centos8 ~]#awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd root /bin/bash wang /bin/bash mage /bin/bash [root@centos8 ~]#awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd root /bin/bash wang /bin/bash mage /bin/bash
不支持直接用行號,但可使用變量NR間接指定行號
/pat1/,/pat2/ 不支持直接給出數字格式
[root@centos8 ~]#seq 10 | awk 'NR>=3 && NR<=6' 3456 [root@centos8 ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd 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 [root@centos8 ~]#sed -n '3,6p' /etc/passwd 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 [root@centos8 ~]#awk '/^bin/,/^adm/' /etc/passwd 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 [root@centos8 ~]#sed -n '/^bin/,/^adm/p' /etc/passwd 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
BEGIN{}:僅在開始處理文件中的文本以前執行一次
END{}:僅在文本處理完成以後執行一次
[root06:33 PMcentos7 ~]#awk -F: 'BEGIN{print "USER UID \n--------------- "}{print $1,$3}' /etc/passwd [root06:38 PMcentos7 ~]#awk -F: 'BEGIN{print "USER UID \n--------"}{print $1,$3}END{print "=========="}' /etc/passwd
[root06:53 PMcentos7 ~]#seq 10 | awk '{i=!i;print i}' 1 0 1 0 1 0 1 0 1 0
語法
if(condition){statement;…}[else statement] if(condition1){statement1}else if(condition2){statement2}else if(condition3) {statement3}......else{statementN}
使用場景:對awk取得的整行或某個字段作條件判斷
[root06:54 PMcentos7 ~]#awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd [root06:58 PMcentos7 ~]#awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd awk '{if(NF>5) print $0}' /etc/fstab awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd awk -F: '{if($3>=1000) printf "Common user: %s\n",$1; else printf "root or Sysuser: %s\n",$1}' /etc/passwd df -h|awk -F% '/^\/dev\/sd/{print $1}'| awk '$NF>=80{print $1,$5}' df | awk -F"[[:space:]]+|%" '/^\/dev\/sd/{if($5>80)print $1,$5}' [root@centos8 ~]#df | awk -F' +|%' '/^\/dev\/sd/{if($5>=10)print $1,$5}' /dev/sda1 15 awk 'BEGIN{ test=100;if(test>90){print "very good"}else if(test>60){ print "good"}else{print "no pass"}}'
[root@centos8 ~]#awk 'BEGIN{print length("hello")}' 5 [root@centos8 ~]#awk 'BEGIN{print length("馬哥教育")}' 4 #顯示每一個字段的長度 [root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i); i++}}' /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-1062.el7.x86_64 31 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13 linux16 7 /vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13 [root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}' /etc/grub2.cfg /vmlinuz-3.10.0-1062.el7.x86_64 31 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 crashkernel=auto 16 net.ifnames=0 13 /vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 crashkernel=auto 16 net.ifnames=0 13 [root@centos8 ~]#awk 'BEGIN{ total=0;i=1;while(i<=100){total+=i;i++};print total}' 5050
# AWK是一條命令解決的,for是多條命令的組合解決的 [root08:02 PMcentos8 /tmp]#time (awk 'BEGIN{sum=0;i=1;while(i<=100000){sum+=i;i++};print sum}') 5000050000 real 0m0.007s user 0m0.006s sys 0m0.001s [root08:02 PMcentos8 /tmp]# [root07:59 PMcentos8 /tmp]#time (for i in {1..100000};do let sum+=$i;done;echo $sum) 5000050000 real 0m0.347s user 0m0.339s sys 0m0.003s [root08:05 PMcentos8 /tmp]#time (seq -s+ 100000 |bc ) 5000050000 real 0m0.036s user 0m0.032s sys 0m0.002s
continue 中斷本次循環
break 中斷整個循環
continue [n] break [n]
#奇數和 [root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}' 2500 #求1到49 之和 [root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==50)break;sum+=i}print sum}' 1225
do {statement;…}while(condition) 意義:不管真假,至少執行一次循環體 do-while循環 語法:do {statement;…}while(condition) 意義:不管真假,至少執行一次循環體 [root@centos8 ~]#awk 'BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print total}' 5050
for(expr1;expr2;expr3) {statement;…} for(variable assignment;condition;iteration process) {for-body} [root@centos8 ~]#awk 'BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}' 5050 特殊用法:可以遍歷數組中的元素 for(var in array) {for-body}
next 能夠提早結束對本行處理而直接進入下一行處理(awk自身循環)
範例:
#看到奇數就跳過
[root@centos8 ~]#awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd root 0 daemon 2 lp 4 shutdown 6 mail 8 games 12 ftp 14 nobody 65534 polkitd 998 gluster 996 rtkit 172 rpc 32 chrony 994 saslauth 992 clevis 984 pegasus 66 colord 982 setroubleshoot 980 gdm 42 gnome-initial-setup 978 sshd 74 avahi 70 tcpdump 72 wang 1000
awk的數組爲關聯數組
weekdays["mon"]="Monday"
index-expression
利用數組,實現 k/v 功能
可以使用任意字符串;字符串要使用雙引號括起來
若是某數組元素事先不存在,在引用時,awk會自動建立此元素,並將其值初始化爲「空串」
若要判斷數組中是否存在某元素,要使用「index in array」格式進行遍歷
[root08:35 PMcentos8 /tmp]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}' Tuesday Monday
[root@centos8 ~]# awk 'BEGIN{array["i"]="x"; array["j"]="y" ; print "i" in array, "y" in array }' 1 0 [root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("i" in array ) {print "存在"}else{print "不存在"}}' 存在 [root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("abc" in array ) {print "存在"}else{print "不存在"}}
for(var in array) {for-body}
注意:var會遍歷array的每一個索引
範例:遍歷數組
[root@centos8 ~]#awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}' Tuesday Monday [root@centos8 ~]#awk 'BEGIN{students[1]="daizong";students[2]="junzong";students[3]="kunzong";for(x in students){print x":"students[x]}}' 1:daizong 2:junzong 3:kunzong [root@centos8 ~]#awk 'BEGIN { a["x"] = "welcome" a["y"] = "to" a["z"] = "Magedu" for (i in a) { print i,a[i] }}' x welcome y to z Magedu [root@centos8 ~]#awk -F: '{user[$1]=$3}END{for(i in user){print "username: "i,"uid: "user[i]}}' /etc/passwd username: adm uid: 3 username: rpc uid: 32 username: dnsmasq uid: 985 username: radvd uid: 75 username: sync uid: 5 username: mail uid: 8 username: exim uid: 93 username: tss uid: 59 username: gluster uid: 996 username: unbound uid: 995 username: halt uid: 7
[root@centos8 ~]#awk 'NR!=1{print $1}' ss.log |sort |uniq -c 118 ESTAB 1 FIN-WAIT-1 11 LAST-ACK [root@centos8 ~]#cat ss.log | sed -nr '1!s/^([^0-9]+) .*/\1/p'|sort |uniq -c 529 ESTAB 9 LISTEN 128 SYN-RECV 95 TIME-WAIT [root@centos8 ~]#ss -ant | awk 'NR!=1{state[$1]++}END{for(i in state){print i,state[i]}}' SYN-RECV 128 LISTEN 9 ESTAB 529 TIME-WAIT 95 [root@centos8 ~]#netstat -tan | awk '/^tcp/{state[$NF]++}END{for(i in state) {print i,state[i]}}' LISTEN 9 SYN_RECV 126 ESTABLISHED 523 FIN_WAIT2 40
鏈接次數超過1000就拒絕
[root@centos8 ~]#awk '{ip[$1]++}END{for(i in ip){if(ip[i]>=1000){system("iptables -A INPUT -s "i" -j REJECT")}}}' nginx.access.log-20200428
一個數組有兩個下標
[root@centos8 ~]#awk 'BEGIN{ > array[1][1]=11 > array[1][2]=12 > array[1][3]=13 > array[2][1]=21 > array[2][2]=22 > array[2][3]=23 > for (i in array) > for (j in array[i]) > print array[i][j] > }' 11 12 13 21 22 23
數值處理:
rand():返回0和1之間一個隨機數
srand():配合rand() 函數,生成隨機數的種子
int():返回整數
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}' #輸出小於1的隨機數 0.790437 [root@centos8 ~]#awk 'BEGIN{srand();print rand()}' 0.283736 [root@centos8 ~]#awk 'BEGIN{srand();print rand()}' 0.948082 [root@centos8 ~]#awk 'BEGIN{srand();print rand()}' 0.371798 [root@centos8 ~]#awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }' 35 17 35 95 19 15 70 54 46 93
字符串處理:
length([s]):返回指定字符串的長度
sub(r,s,[t]):對t字符串搜索r表示模式匹配的內容,並將第一個匹配內容替換爲s
範例:
[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)' 2008-08:08 08:08:08 [root@centos8 ~]#echo "2008:08:08 08:08:08" | awk '{sub(/:/,"-",$1);print $0}' 2008-08:08 08:08:08
gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,並所有替換爲s所表示的內容
範例:
[root10:32 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)' 2008-08:08 08:08:08 [root10:33 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk '{gsub(/:/,"-",$0);print $0}' 2008-08-08 08-08-08 [root10:35 PMcentos8 /tmp]#echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0){print $0}' 2008-08-08 08-08-08
split(s,array,[r]):以r爲分隔符,切割字符串s,並將切割後的結果保存至array所表示的數組中,第一個
索引值爲1,第二個索引值爲2,…
[root10:40 PMcentos8 /tmp]#netstat -tn Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 36 10.0.0.130:22 10.0.0.1:51452 ESTABLISHED [root@centos8 ~]#netstat -tn | awk '/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}' 10.0.0.1 1 10.0.0.6 1 10.0.0.7 673
system 函數:能夠awk中調用shell命令
空格是awk中的字符串鏈接符,若是system中須要使用awk中的變量可使用空格分隔,或者說除了
awk的變量外其餘一概用""引用起來
awk 'BEGIN{system("hostname")}' awk 'BEGIN{score=100; system("echo your score is " score) }' [rootentos8 ]#netstat -tn | awk '/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){if(count[i]>=10){system("iptables -A INPUT -s "i" -j REJECT")}}}'
自定義函數格式:
function name ( parameter, parameter, ... ) { statements return expression }
範例:
[root@centos8 ~]#cat func.awk function max(x,y) { x>y?var=x:var=y return var } BEGIN{print max(a,b)} [root@centos8 ~]#awk -v a=30 -v b=20 -f func.awk 30
將awk程序寫成腳本,直接調用或執行
[root@centos8 ~]#cat passwd.awk {if($3>=1000)print $1,$3} [root@centos8 ~]#awk -F: -f passwd.awk /etc/passwd nobody 65534 wang 1000 mage 1001
awkfile var=value var2=value2... Inputfile
注意:在BEGIN過程當中不可用。直到首行輸入完成之後,變量纔可用。能夠經過-v 參數,讓awk在執行
BEGIN以前獲得變量的值。命令行中每個指定的變量都須要一個-v參數
範例:
[root@centos8 ~]#cat test2.awk #!/bin/awk -f {if($3 >=min && $3<=max)print $1,$3} [root@centos8 ~]#chmod +x test2.awk [root@centos8 ~]#./test2.awk -F: min=100 max=200 /etc/passwd systemd-resolve 193 rtkit 172 pulse 171 qemu 107 usbmuxd 113 abrt 173
一、文件host_list.log 以下格式,請提取」.magedu.com」前面的主機名部分並寫入到回到該文件中
1 www.magedu.com 2 blog.magedu.com 3 study.magedu.com 4 linux.magedu.com 5 python.magedu.com ...... 999 study.magedu.com [root07:16 AMcentos8 ~]#awk -F" +|[.]" '{print $2}' host_list.log >>host_list.log
二、統計/etc/fstab文件中每一個文件系統類型出現的次數
[root11:31 PMcentos8 ~]#awk '/^[^#]/{file[$3]++}END{for(i in file)printf "文件系統類型:%s 個數:%s\n", i, file[i]}' /etc/fstab 文件系統類型:swap 個數:1 文件系統類型:ext4 個數:1 文件系統類型:xfs 個數:2
三、統計/etc/fstab文件中每一個單詞出現的次數
[root11:39 PMcentos8 ~]#grep -Eo '\<[[:alpha:]]+\>' /etc/fstab |sort |uniq -c [root12:01 AMcentos8 ~]#awk '{for(i=1;i<=NF;i++){counts[$i]++}}END{for(j in counts){print j, counts[j]}}' /etc/fstab |wc -l
四、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的全部數字
[root12:17 AMcentos8 ~]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk '{gsub(/[^0-9]/,"",$0);print $0}' 05973 或者方法二: echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | tr 'a-z' 'A-Z' | awk -F "[A-Z]|[%&@+]" '{for (i=1;i<=NF;i++){print $i}}' | tr -s "\n"
五、有一文件記錄了1-100000之間隨機的整數共5000個,存儲的格式100,50,35,89…請取出其中最大和
最小的整數
六、解決Dos***生產案例:根據web日誌或者或者網絡鏈接數,監控當某個IP併發鏈接數或者短時內
PV達到100,即調用防火牆命令封掉對應的IP,監控頻率每隔5分鐘。防火牆命令爲:iptables -A
INPUT -s IP -j REJECT七、將如下文件內容中FQDN取出並根據其進行計數從高到低排序
[root07:37 AMcentos8 ~]#ss -nt | awk -F " +|:" '{ip[$4]++}END{for(i in ip){if(ip[i]>100){system("iptables -A INPUT -s "i" -j REJECT")}}}'
7.將如下文件內容中FQDN取出並根據其進行計數從高到低排序
http://mail.magedu.com/index.html
http://www.magedu.com/test.html
http://study.magedu.com/index.html
http://blog.magedu.com/index.html
http://www.magedu.com/images/logo.jpg
http://blog.magedu.com/20080102.html
http://www.magedu.com/images/magedu.jpg
參考答案:
~~~相、
[root@centos8 ~]#awk -F"/" '{url[$3]++}END{for(i in url){print url[i],i}}'
url.log |sort -nr
3 www.magedu.com
2 blog.magedu.com
1 study.magedu.com
1 mail.magedu.com
八、將如下文本以inode爲標記,對inode相同的counts進行累加,而且統計出同一inode中, beginnumber的最小值和endnumber的最大值 inode|beginnumber|endnumber|counts| 106|3363120000|3363129999|10000| 106|3368560000|3368579999|20000| 310|3337000000|3337000100|101| 310|3342950000|3342959999|10000| 310|3362120960|3362120961|2| 311|3313460102|3313469999|9898| 311|3313470000|3313499999|30000| 311|3362120962|3362120963|2| 輸出的結果格式爲: 310|3337000000|3362120961|10103| 311|3313460102|3362120963|39900| 106|3363120000|3368579999|30000| ~~~bash [root07:47 AMcentos8 ~]#cat sd inode|beginnumber|endnumber|counts| 106|3363120000|3363129999|10000| 106|3368560000|3368579999|20000| 310|3337000000|3337000100|101| 310|3342950000|3342959999|10000| 310|3362120960|3362120961|2| 311|3313460102|3313469999|9898| 311|3313470000|3313499999|30000| 311|3362120962|3362120963|2| [root07:47 AMcentos8 ~]#awk -F "|" '/^[^i]/{inode[$1]++;if(0){begin[$1]=$2}else if(begin[$1]>$2){begin[$1]=$2};if(end[$1]<$3){end[$1]=$3};count[$1]+=$(NF-1)}END{for (i in inode){print i,begin[i],end[i],count[i]}}' sd 106 3368579999 30000 310 3362120961 10103 311 3362120963 39900