awk,sed,grep运用正则与扩展正则
生活随笔
收集整理的這篇文章主要介紹了
awk,sed,grep运用正则与扩展正则
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.正則與擴展正則的概述?
?
?
?
2.示例?
grep 過濾工具 ---格式:grep 【選項】 “正則表達式“ 文件 egrep 過濾工具 ---格式:egrep 【選項】 “擴展正則表達式“ 文件 head -5 /etc/passwd > user //準備素材 grep ^root user //找以root開頭的行 grep bash$ user //找以bash結尾的行 grep ^$ user //找空行 grep -v ^$ user //顯示除了空行的內容grep "[root]" user //找rot任意一個字符 grep "[rot]" user //效果同上 grep "[^rot]" user //顯示r或o或t以外的內容 grep "[0123456789]" user //找所有數字 grep "[0-9]" user //效果同上 grep "[^0-9]" user //顯示數字以外內容 grep "[a-z]" user //找所有小寫字母 grep "[A-Z]" user //找所有大寫字母 grep "[a-Z]" user //找所有字母 grep "[a-Z0-9]" user //找所有字母和數字 grep "[^a-Z0-9]" user //找特殊符號grep "." user //找任意單個字符,文檔中每個字符都可以理解為任意字符 grep "r..t" user //找rt之間有2個任意字符的行 grep "r.t" user //找rt之間有1個任意字符的行,沒有匹配內容,就無輸出 grep "*" user //錯誤用法,*號是匹配前一個字符任意次,不能單獨使用 grep "ro*t" user //找rt,中間的o有沒有都行,有幾次都行 grep ".*" user //找任意,包括空行 .與*的組合在正則中相當于通配符的效果grep "ro\{1,2\}t" user //找rt,中間的o可以有1~2個 grep "ro\{2,6\}t" user //找rt,中間的o可以有2~6個 grep "ro\{2,\}t" user //找rt,中間的o可以有2個以及2個以上 grep "ro\{1,\}t" user //找rt,中間的o可以有1個以及1個以上 grep "ro\{3,\}t" user //找rt,中間的o可以有3個以及3個以上 grep "ro\{2\}t" user //找rt,中間的o必須只有有2個 grep "ro\{1\}t" user //找rt,中間的o必須只有有1個 grep "ro\{3\}t" user //找rt,中間的o必須只有有3個grep "\(0:\)\{2\}" user //找連續的2個0: 小括號的作用是將字符組合為一個整體以上命令均可以加-E選項并且去掉所有\,改成擴展正則的用法,比如 grep "ro\{1,\}t" user可以改成 grep -E "ro{1,}t" user 或者 egrep "ro{1,}t" user grep "ro\{1,\}t" user //使用基本正則找o出現1次以及1次以上 egrep "ro{1,}t" user //使用擴展正則,效果同上,比較精簡 egrep "ro+t" user //使用擴展正則,效果同上,最精簡 grep "ro\{0,1\}t" user //使用基本正則找o出現0~1次 egrep "ro{0,1}t" user //使用擴展正則,效果同上,比較精簡 egrep "ro?t" user //使用擴展正則,效果同上,最精簡egrep "root|^bin" user //找有root或者以bin開頭的行 cat aa //素材文件,里面有一些"the" the there the6 the_ 123the egrep "the\b" aa //在aa文件中找the,右邊不允許出現數字、字母、下劃線 egrep "\bthe\b" aa //找the,兩邊都不允許出現數字、字母、下劃線 sed 流式編輯器 對文檔進行非交互式增刪改查的操作 逐行處理 用法1:前置命令 | sed [選項] '條件指令' 用法2:sed [選項] '條件指令' 文件.. .. 選項: -n 屏蔽默認輸出 -r 支持擴展正則 -i 修改源文件 指令: p 輸出 d 刪除 s替換 sed -n 'p' user //輸出所有行 sed -n '1p' user //輸出第1行 sed -n '2p' user //輸出第2行 sed -n '3p' user //輸出第3行 sed -n '2,4p' user //輸出2~4行 sed -n '2p;4p' user //輸出第2行與第4行 sed -n '2,+1p' user //輸出第2行以及后面1行 sed -n '/^root/p' user //輸出以root開頭的行 sed -n '/root/p' user //輸出包含root的行 sed -nr '/^root|^bin/p' user 將以上語句中的p指令改為d指令可以實現對應行的刪除效果 比如sed -n '2p' user 改成 sed '2d' user 是刪除第2行 sed -n '2!p' user //輸出除了第2行的內容,加!是取反效果 sed '3,+1!d' user //刪除第3行、第4行以外的行 sed -n '=' user //顯示行號,=號在sed中可以顯示行號 sed -n '$=' user //查看文檔最后一行的行號,相當于查看文檔總行數sed -i '$d' user //刪除文檔的最后一行并保存sed 's/2017/6666/' test.txt //把所有行的第1個2017替換成6666 sed 's/2017/6666/2' test.txt //把所有行的第2個2017替換成6666 sed '1s/2017/6666/' test.txt //把第1行的第1個2017替換成6666 sed '3s/2017/6666/3' test.txt //把第3行的第3個2017替換成6666 sed '3s/2017//3' test.txt //把第3行的第3個2017替換成空,相當 于刪除 sed '/2024/s/2017/6666/' test.txt //找到有2024的行,將2017替換 成6666 ---------------------------------- 嘗試將user文檔中/bin/bash替換成/sbin/sh sed '1s//bin/bash//sbin/sh/' user //直接替換,報錯 sed '1s/\/bin\/bash/\/sbin\/sh/' user //使用轉義符號可以 成功,但不方便 sed '1s!/bin/bash!/sbin/sh!' user //最佳方案,更改s的替換符 sed '1s@/bin/bash@/sbin/sh@' user //替換符號可以用所有 數字鍵上的 -------------------------------------- 編寫腳本,安裝httpd服務,需要使用82號端口開啟 #!/bin/bash yum -y install httpd &> /dev/null sed -i '/^Listen 80$/s/0/2/' /etc/httpd/conf/httpd.conf //將以Listen 80開 頭的行的0換成2 systemctl restart httpd systemctl enable httpdecho "web-test~~~" > /var/www/html/index.html setenforce 0 //執行完腳本后,關閉selinux systemctl stop firewalld //關閉防火墻 curl 192.168.4.7:82 //測試82端口訪問頁面 sed替換的高級應用 1)刪除文件中每行的第二個、最后一個字符 sed 's/.//2;s/.$//' test??? //分兩個步驟完成,中間用分號隔開,第一步將每行的第二個任意字符替換成空,第二步將每行的最后一個任意字符替換成空即可2)刪除文件中所有的數字 sed 's/[0-9]//g' nssw.txt3)將文件中每行的第一個、倒數第1個字符互換 () 保留(復制) 實現思路: echo abc > abc??????????????????????????? //創建素材 sed -r 's/(a)(b)(c)/\3\2\1/' abc? //替換abc時復制每一個字符,后面替換的內容用\數字粘貼,可以任意調換位置 echo xyz >> xyz?? //追加內容 sed -r 's/(a)(b)(c)/\3\2\1/' abc? //再用之前的方法無法替換第2行 sed -r 's/(.)(.)(.)/\3\2\1/' abc? //將具體字符用 . 替代即可,然后,再將追加abcd時,上述方案失靈 sed -r 's/^(.)(.*)(.)$/\3\2\1/' abc?? //再次升級,分別找到第1個字符和最后1個字符,中間可以是任意 sed -r 's/^(.)(.*)(.)$/\3\2\1/' ?nssw.txt?? //達成需求4)為文件中每個大寫字母添加括號 sed -r 's/([A-Z])/(\1)/g' ?nssw.txt? //先找到任意大寫字母,然后保留,最后替換成帶括號的狀態編寫腳本,安裝httpd服務,使用82號端口 #!/bin/bash yum -y install httpd?? //裝包 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak?? //備份配置文件 sed -i '/Listen 80/s/0/2/' /etc/httpd/conf/httpd.conf?? //修改配置文件 systemctl restart httpd?? //啟動服務運行腳本之后,使用curl 192.168.4.7:82測試 或者火狐瀏覽器192.168.4.7:82 要關閉selinux與防火墻 ?還可以使用 netstat -ntulp |grep :82查詢服務 setenforce 0??? //如果腳本執行之前沒關閉selinux,會報錯 systemctl stop firewalld?? //關閉防火墻sed指令 除了p、d、s之外還有: a行下追加 i行上添加 c替換整行 sed 'a 666' user //所有行的下面追加666 sed '1a 666' user //第1行的下面追加666 sed '/^bin/a 666' user //在以bin開頭的行的下面追加666 sed 'i 666' user //所有行的上面添加666 sed '5i 666' user //第5行的上面添加666 sed '$i 666' user //最后1行的上面添加666 sed 'c 666' user //所有行都替換成666 sed '1c 666' user //替換第1行為666sed 替換文件到另一個文件中的指定行 sed -i '15r a.txt' b.txt //把啊a.txt的文件替換到b.txt的15行------------------------------------------------------------------------ 編寫腳本,找到系統使用bash的賬戶名,然后按照 用戶名 --> 密碼的格式存儲在一個文件中 grep "bash$" /etc/passwd | sed 's/:.*//' //找到以bash結尾的用戶 再用sed去掉用戶后面:開始的所有內容,留下的就是用戶名 sed -n '/bash$/s/:.*//p' /etc/passwd //用sed找到以bash結尾的用戶 然后去掉用戶后面:開始的所有內容,最后加p的作用是僅僅顯示被 替換的行 #!/bin/bash u=$(sed -n '/bash$/s/:.*//p' /etc/passwd) //在文檔中找到以bash結尾的行 并且將行中:以及:后面的所有內容替換為空,留下的就是用戶的名字,然后將 這些名字放入變量u里面 for i in $u //把上一步找到的用戶放入循環 dopass=$(grep $i /etc/shadow) //將每個人的密碼信息找出pass1=${pass#*:} //掐頭pass2=${pass1%%:*} //去尾,得到密碼echo "$i --> $pass2" >> /opt/user.txt //按格式存在一個文檔里 done awk 精確搜索 逐行處理(二次處理) 格式1:前置指令 | awk [選項] '[條件]{指令}' 格式2:awk [選項] '[條件]{指令}' 文件 指令: print 輸出 選項:-F 定義分隔符 內置變量: $1第1列 $2第2列 $3 ... $0所有列 NR行號 NF列號 awk '{print $1}' test.txt //輸出所有行的第1列 awk '{print $3}' test.txt //輸出所有行的第3列 awk '/the/{print $3}' test.txt //輸出有the的行的第3列 awk '/the/{print NR}' test.txt //輸出有the的行的行號 awk '{print NR}' test.txt //輸出所有行的行號 awk '{print NF}' test.txt //輸出所有行的列號 awk '{print $0,NR}' test.txt //輸出所有列然后空格輸出行號 head -5 /etc/passwd > user awk -F: '{print $1}' user //使用-F:修改分隔符為冒號,輸出第1列 awk -F: '{print $1,$7}' user //使用-F:修改分隔符為冒號,輸出第1列空格第7列 awk -F: '{print $1,"的解釋器是",$7}' user //輸出常量加引號 練習: 使用awk收集網卡流量信息 ifconfig eth0 | awk '/RX p/{print "服務器eth0網卡的接收流量是"$5"字節"}' ifconfig eth0 | awk '/TX p/{print "服務器eth0網卡的發送流量是"$5"字節"}' 收集根分區剩余容量 df -h | awk '/\/$/{print "根分區剩余容量是"$4}' ------------------------------------------------------------------------ awk中的條件 使用正則 ~包含 !~不包含 awk -F: '$6~/bin/{print}' user //找第6列包含bin的行 awk -F: '$6!~/bin/{print}' user //找第6列不包含bin的行 使用數字或者字符串 == != >= > <= < awk -F: 'NR==1{print}' user //輸出第1行 awk -F: 'NR!=3{print}' user //輸出除了第3行以外的行 awk -F: 'NR<4{print}' user //輸出1~3行 awk -F: '$1=="root"{print}' user //輸出第1列等于root的行 awk -F: '$1~/root/{print}' user //輸出第1列包含root的行 3,邏輯組合 &&并且 ||或者 awk -F: '$3<10&&$7~/bash/' /etc/passwd //輸出第3列(UID)小于10并且 第7列包含bash的行,當給了條件輸出一整行時{print}可以省略不寫 awk -F: 'NR>=2&&NR<=6' /etc/passwd //輸出2~6行 awk -F: '$1~/root/||$3<=5' /etc/passwd //輸出第1列包含root或者UID小 于等于5的行4,運算 awk 'NR%2==0' user //輸出偶數行------------------------------------------------------ awk執行額外任務BEGIN{ } 執行1次,讀取文檔之前執行 逐行任務 執行n次 ,讀取文檔時執行 END{ } 執行1次,讀取文檔之后執行awk 'BEGIN{ }{ }END{ }' //使用時基本框架 awk 'BEGIN{print "xyz"}{print "xyz"}END{print "xyz"}' user //輸出1 個xyz之后再根據user文檔的行數輸出5個xyz,最后再輸出一個xyzawk 'BEGIN{print "User\tUID\tHome"}' //輸出表頭信息 awk -F: '{print $1"\t"$3"\t"$6}' user //輸出內容,用戶名,uid,家目錄 awk 'END{print "總計"NR"行"}' user //最后輸出行數awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6} END{print "總計"NR"行"}' user-------------------------------------------------------------------------------- 使用awk統計網站訪問量: 開啟httpd服務,80端口或者82端口都可以 使用curl 192.168.4.7:82 多訪問幾次網站 測試時可以關閉防火墻和selinux systemctl stop firewalld setenforce 0 awk '{print $1}' /var/log/httpd/access_log //可以找出訪問者的ip,但是效果不完美,可以用后面的數組方式解決awk,for,if循環實現高級搜索awk 中使用if單分支,如果滿足條件,就執行指令,不滿足就不執行任何指令 if(條件){指令} awk -F: 'BEGIN{x=0}{if($7~/bash/){x++}}END{print x}'? /etc/passwd? //統計系統中,有多少用戶使用了bash,首先定義變量x,然后使用if判斷如果每找到一行的$7包含bash,就把x+1,所有逐行任務結束后,最終使用end任務輸出x的值,也就是找系統中使用bash作為解釋器的用戶數量雙分支,如果滿足條件就執行指令,不滿足就執行else后面的指令 if(條件){指令}else{指令} awk -F: 'BEGIN{x=0;y=0}{if($7=="/bin/bash"){x++}else{y++}}END{print x,y}' /etc/passwd //統計系統中使用bash作為解釋器的用戶,和沒有使用bash的用戶數量,使用if判斷如果每找到一行的$7是/bin/bash,就把x+1,否則y+1,最后使用end輸出x與y的值多分支 {if (條件){指令}else if (條件){指令}else{指令}} awk -F: '{if($7=="/bin/bash"){x++}else if($7=="/sbin/nologin"){y++}else{z++}}END{print x,y,z}' /etc/passwd?? //統計系統中使用bash作為解釋器的用戶,使用nologin的用戶,還有其他用戶的數量,變量如果作為運算使用,并且初始值是0的 ,可以省略定義過程數組 相當于可以存儲多個值的特殊變量 數組名稱[下標]=下標對應的值[root@svr7 opt]# awk 'BEGIN{a[1]=10;a[2]=20;print a[1],a[2]}' //使用awk測試數組 創建了一個數組名字叫a,分別定義兩個下標與對應的兩個值,然后 用print查看了a[1]的值和a[2]的值數組可以用來收集信息 for循環可以循環輸出數組的下標a[abc]=0 a[abc]++ a[abc]=1 a[xyz]=0 a[xyz]++ a[xyz]=1 a[abc]=1 a[abc]++ a[abc]=2 awk '{a[$1]++}END{print a["abc"],a["xyz"]}' abc.txt //根據上述結果,得到如果 使用{a[$1]++}走完所有行便可收集到a[xyz]=1和a[abc]=2的結果,所以 在最后使用END任務輸出a[abc]和a[xyz]的值就是 2和 1awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc.txt //使用for循環,循環顯示 數組a的下標,與值,其中for(i in a)里面的i是變量,代表下標,in是語法不 能變,a是數組名awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log //將上述 的abc.txt文件替換成網站的日志,就可以最終用來查看日志得到可以得到 哪個ip來訪以及來訪的次數awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log | sort -nr 查看日志中某個ip的出現次數,以及ip,然后按降序排列,出現次數最大的 顯示在第一行,sort命令可以實現排序效果,-n是以數字排序,-r是降序awk '/Failed password for root/{ip[$11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure //查看哪個ip登錄root賬戶時輸入錯了密碼,先輸出次數,再輸出ip編寫監控腳本,可以查看各種服務器的信息 #!/bin/bash while : do clear //清屏 ifconfig eth0 | awk '/RX p/{print "服務器eth0網卡的接收流量是"$5"字節"}' ifconfig eth0 | awk '/TX p/{print "服務器eth0網卡的發送流量是"$5"字節"}' df -h | awk '/\/$/{print "根分區剩余容量是"$4}' awk 'END{print "服務器賬戶總數是"NR"個"}' /etc/passwd echo "當前已登陸賬戶數量是$(who | wc -l)個" free -h | awk '/^Mem:/{print "服務器內存剩余容量是"$4}' uptime | awk '{print "cpu的15分鐘平均負載是"$NF}' echo "服務器安裝軟件包數量是$(rpm -qa | wc -l)個" sleep 3 //休息3秒 done 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的awk,sed,grep运用正则与扩展正则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署企业私有镜像仓库Harbor
- 下一篇: 分卷压缩并解压 (线上服务器如何把很大的