shell腳本-正則、grep、sed、awk

来源:https://www.cnblogs.com/omgasw/archive/2019/04/15/10709985.html
-Advertisement-
Play Games

--正則-- 基礎正則 註:egrep,grep –E或sed –r 過濾一般特殊字元可以不轉義 擴展正則(egrep或grep -E) --grep-- 語法:grep [選項] [條件表達式] 目標文件 --sed-- 語法:sed [options] 'command' file(s) 選項: ...


--正則--

基礎正則

^word     ##搜索以word開頭的 vi/vim中 ^ 一行的開頭
word$     ##搜索以word結尾的 vi/vim中 $ 一行的結尾
^$        ##表示空行
.         ##代表且只能代表任意一個字元
\         ##例:\. 只代表點本身,轉義符號,讓有特殊身份意義的字元,脫掉馬甲,還原
\n        ##換行符
\r        ##匹配回車
\w         ##匹配任意一個字元和數字
*         ##重覆0次或多次前面的一個字元
.*        ##匹配所有字元。例:^.* 以任意多個字元開頭,.*$以任意多個字元結尾
[abc]     ##匹配字元集內的任意一個字元
[^abc]    ##匹配不包含 ^ 後的任意字元的內容。中括弧里的 ^ 為取反
[1-9]     ##表示匹配括弧內的範圍內的任意字元
a\{n,m\}  ##重覆n到m次前一個重覆的字元。若用egrep、sed -r可以去掉斜線
\{n,\}    ##重覆至少n 次前一個重覆的字元。若用egrep、sed -r可以去掉斜線
\{n\}     ##重覆n 次前一個重覆的字元。若用egrep、sed -r可以去掉斜線
\{,m}\    ##重覆少於m次

註:egrep,grep –E或sed –r 過濾一般特殊字元可以不轉義

擴展正則(egrep或grep -E)

+          ##重覆一次或一次以上前面的一個字元
?          ##重覆0次或一次前面的一個字元
|          ##或者的意思,用或的方式查找多個符合的字元串
()         ##找出括弧內的字元串
^linux         ##以linux開始
linux$         ##以linux結束
linuxfan.      ##匹配linuxfans等
coo[kl]        ##匹配cool或cook
9[^5689]       ##匹配91,92等,但不匹配95,96,98,99
[0-9]          ##匹配任意一個所有的數字
[a-z]|[A-Z]    ##匹配任意一個所有大小寫字母,|屬於擴展正則grep -E支持
colou?r        ##匹配color或colour,但是不能匹配colouur
rollno-9+      ##匹配rollno-9、rollno-99,rollno-999,但不匹配rollno-
co*l           ##匹配cl,col,cool,coool等
ma(tri)x       ##匹配matrix
[0-9]{3}       ##匹配任意一個三位數,等於[0-9][0-9][0-9]
[0-9]{2,}      ##匹配任意一個兩位數或更多位的數字
[0-9]{2,5}     ##匹配從兩位數到五位數之間的任意一個數字
Oct (1st|2nd)  ##匹配Oct 1st或Oct 2nd
a\.b           ##匹配a.b,但不能匹配ajb
[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}              ##匹配一個郵箱地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}  ##匹配IP地址

 

--grep--

語法:grep [選項] [條件表達式] 目標文件

 

cat /proc/meminfo |grep  -e Mem -e Cache -e Swap         ##查看系統記憶體、緩存、交換分區-e的作用是匹配多個表達式
grep -R -o -n -E   '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/         ##查找/etc目錄下的所有文件中的郵件地址;-R遞歸,-n表示匹配的行號,-o只輸出匹配內容,-E支持擴展正則表達式,
grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"          ##查找/etc/目錄下文件中包含“HOSTNAME”的次數,-c統計匹配次數,-v取反
grep -R -l 'HOSTNAME' /etc/                      ##查找包含“HOSTNAME”的文件名,-l顯示匹配的文件名,-L顯示不匹配的文件名
dmesg | grep -n --color=auto 'eth'              ##查找內核日誌中eth的行,顯示顏色及行號
dmesg | grep -n -A3 -B2 --color=auto 'eth'          ##用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,在關鍵字所在行的前兩行與後三行也一起找出出來顯示
cat /etc/passwd |grep -c bash$                  ##統計系統中能登錄的用戶的個數
touch /tmp/{123,123123,456,1234567}.txt      ##創建測試文件,以下三條命令是一樣的效果,匹配文件名123,可以包含1個到多個
ls |grep -E '(123)+' 
ls |grep '\(123\)\+'
ls |egrep  '(123)+'
ps -ef |grep -c httpd                          ##統計httpd進程數量
grep -C 4 'games' --color /etc/passwd              ##顯示games匹配的“-C”前後4行
grep ^adm /etc/group                          ##查看adm組的信息
ip a |grep -E '^[0-9]' |awk -F : '{print $2}'          ##獲取網卡名稱
ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep  -o '[0-9.]*'      ##截取ip地址,[^ ]*表示以非空字元作為結束符,[0-9.]*表示數字和點的組合
ip a |grep inet |grep eth0 |grep -o "inet[^/]*" |grep -o "[0-9.]*"    ##截取ip地址
ifconfig eth0 |grep -i hwaddr |awk '{print $5}'      ##截取MAC地址
ip a |grep -A 3 "eth0" |grep link/ether |grep -o "ether[^r]*" |grep -o -E "[0-9a-f:]+"|grep -E "[0-9a-f:]{2}$"            ##截取MAC地址

grep "^m" oldboy.log             ##過濾輸出以m開頭的行
grep "m$" oldboy.log 
grep -vn "^$" oldboy.log             ##過濾空行
grep -o "0*" oldboy.log 
grep -o "oldb.y" oldboy.log 
grep "\.$" oldboy.log             ##以.結尾的行
grep "0\{3\}" oldboy.log             ##重覆三次

 

--sed--

語法:sed [options] 'command' file(s)
選項:
-n 抑制自動列印pattern space,sed預設輸出全部,-n用於取消預設輸出
-i 編輯文件
-r 支持擴展正則表達式

1.改:
語法:sed '/正則匹配條件/s/old/new/g' 文件
sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是顯示,不修改
sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改,不顯示
sed -i 's/dhcp/static/g' ip ##將所有的dhcp替換為static
sed -i '/^IP1/s/static/dhcp/g' ip ##將IP1開頭的行替換
sed -i '2s/static/dhcp/g' ip ##指定特定行號2行替換
cat -n /etc/selinux/config ##查看並顯示行號
sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##開啟selinux

2.刪:
語法:sed '/表達式/d' 文件
vim ip ##添加空行
sed '/^$/d' ip ##刪除空行並顯示在屏幕上
sed -i '/IP1/d' ip ##刪除包含IP1的行
sed -i '/^IP2/d' ip ##刪除以IP2開頭的行
sed -i '2d' ip ##刪除第二行

3.增:
語法:sed ' /表達式/a "需要添加的文字"' 文件
sed 'a IP3=static' ip ##每一行後都加上IP3=static
sed '3a IP3=static' ip ##只在第3行後加上IP3=static,並顯示不修改
sed '3i IP3=static' ip ##只在第3行前加上IP3=static,顯示不修改
sed -i '3a IP3=static' ip ##修改,不顯示
sed -i '/^IP3/a "test add"' ip ##在以IP3開頭的行後添加

4.查:
語法:sed -n '/表達式/p' 文件
sed -n '2p' /etc/hosts ##查看第二行
sed -n '/www/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看包含www的解析記錄
sed -n '/.100$/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看以.100結尾的行
sed -n '2~2p' ip ##從第二行,每隔兩行顯示

ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g'        ##註:當sed命令處理的內容為多行內容,則以/作為表達式的分隔,若sed命令處理的內容為單行內容,作為截取的作用,以#號作為分隔符;
10.0.0.9 
ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g'        ##-r支持擴展正則,\2將2轉義,列印出第二個範圍(.*)
10.0.0.9  
ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*$#\1#g'
10.0.0.9 
ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.9
ifconfig eth0|sed -nr '1s#^.*dr (.*)#\1#gp'
00:0C:29:33:C8:75  
ifconfig eth0|sed -n '1p'|sed -r 's#(^.*dr )(.*)#\2#g'
00:0C:29:33:C8:75
ifconfig eth0|sed -n '1p'|sed 's#^.*dr ##g'            
00:0C:29:33:C8:75
ifconfig eth0|sed -nr '1s#^.*t (.*) 00.*$#\1#gp'
HWaddr
stat /etc/hosts|sed -n '4p'                                
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
stat /etc/hosts|sed -n '4p'|sed 's#^.*ss: (##g'|sed 's#/-.*$##g'
0644
stat /etc/hosts|sed -n '4p'|sed -r 's#^.*s: \((.*)/-.*$#\1#g'
0644
stat /etc/hosts|sed -nr '4s#^.*s: \((.*)/-.*$#\1#gp'
0644
stat /etc/hosts|sed -nr '4s#(^.*s: \()(.*)(/-.*$)#\2#gp'
0644

 

--awk--

語法:
awk [選項] '模式{動作(action)}' 文件1 文件2 ...
選項: -F   指定輸入分隔符,可以是字元串或正則表達式
常用動作: print、printf

chkconfig --list |grep 3:啟用 |awk '{print $1}'
tail -1 /etc/passwd |awk -F ':' 'BEGIN{OFS="---"}{print $1,$6,$7}'   ##OFS指定輸出分隔符
ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print $4}'
ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print "eth1_ip="$4}'  ##可以加入顯示內容
awk 'BEGIN {print "line one \nline two\nline three"}'

 

匹配範圍(ranges):指定的匹配範圍,格式為part1,part2
awk -F : '$3==3,$3==10{print $1,$3,$7}' /etc/passwd
awk -F : '$1=="root",$1=="adm"{print $1,$3,$7}' /etc/passwd
awk -F : '/^r/,/^a/{print $1,$3,$7}' /etc/passwd

awk區塊原理:
區域構成:
BEGIN { 動作 } ##開始處理第一行文本之前的操作
{ 動作 } ##針對每一行文本的處理操作
END { 動作 } ##處理完最後一行文本之後的操作
執行流程:
首先執行 BEGIN { } 區塊中的初始化操作;
然後從指定的數據文件中迴圈讀取一個數據行(自動更新 NF、 NR、 $0、 $1…… 等內建變數的值),並執行'模式或條件{ 動作 }';
最後執行 END { } 區塊中的後續處理操作。
案例:
awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd ##在awk處理之前列印頭部BEGIN{}

ifconfig eth0 |awk -F':' 'NR==2{print $2,$4}'|awk 'BEGIN{OFS=" / "}{print "IP="$1,"MASK="$3}'

awk的變數:
awk變數:
FS:列分隔符,預設位空白
RS:行分隔符,預設位換行符
OFS:輸出列分隔符
ORS :輸出行分隔符
awk內置變數:
NR:處理中行數
FNR:單個文件的行數
NF:列的個數
案例:
ifconfig eth1 |awk '{print NR}'
ifconfig eth1 |awk '{print NF}'
自定義變數案例:
awk 'BEGIN{test="www.linuxfan.cn";print test}'
awk -v test="linuxfan.cn" 'BEGIN{print test}'

printf的使用:
格式:printf "格式",列表1,列表2 ...
特征:
a.必須指定format(格式),用於指定後面item(列表)的輸出格式
b.printf語句不會自動列印換行符:\n
c.format格式以%加一個字元,如下:
%c:顯示字元的ASCII碼
%d,%i:十進位整數
%f:顯示浮點數(小數)
%s:顯示字元串
%u:無符號整數
%%:顯示%
d.修飾符:N:顯示寬度,-:左對齊,+:顯示數值符號,如%-c(左對齊)
案例:
chkconfig --list |grep 3:啟用 |awk '{printf "%-10s",$1}' ##在統一行顯示
awk -F : '{printf "%-15s %-10d %-10s\n",$1,$3,$7}' /etc/passwd

awk的操作符:
算數操作符: x^y、x/y、x+y、x-y、x%y
比較操作符:>、<、>=、<=、==、!=
邏輯操作符:&&、||、!

awk常見的模式類型
正則表達式(regexp):awk -F : '/^u/{print $1}' /etc/passwd
表達式(expression):值位非0或位非空是滿足條件,如$1 ~ /foo/或 $1 == "root"
案例:
awk -F : '$3>=500{print $1,$3,$7}' /etc/passwd ##列印普通用戶
awk -F : '$3+1<=100&&$3+1>=10{print $1,$3,$7}' /etc/passwd ##UID在10-100之間的用戶
awk -F : '$2=="!!"{print $1,$2}' /etc/shadow ##檢查未初始化密碼的用戶
passwd -d u01
awk -F : '$2==""{print $1}' /etc/shadow ##列印密碼為空的用戶
awk -F : '$7~"bash$"{print $1,$3,$7}' /etc/passwd ##匹配$7為bash結束行
awk -F : '$7!~"bash$"{print $1,$3,$7}' /etc/passwd


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:https://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx EF 6 Code-First系列文章目錄: 1 翻譯系列:什麼是Code First(EF 6 Code First ...
  • Windows Server MySQL 遠程訪問 工作主要為兩部分, 一部分是 Windows 防火牆, 一部分是 MySQL 自身 Windows 埠遠程訪問 其實就是在 Windows 防火牆中加一條特定埠的入站規則 1. 控制面板→系統和安全→Windows防火牆 2. 點擊左側菜單中的 ...
  • 什麼是版本庫?什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原” 創建一個版本庫 添加文件到git倉庫 ...
  • 本篇文章作為Linux 入門的必備篇,主要簡述Linux系統目錄結構和Linux 基本Shell命令,大致內容如下: ​ ​ 一 Linux目錄及其概述 如下目錄為CentOS 7目錄結構 ​ 1.建立目錄 mkdir 該命令用來創建目錄。 (1)一次性創建一個目錄 mkdir mydir ​ (2 ...
  • 一、Docker的安裝和啟動 使用環境centos7 1. yum包更新到最新 2. 安裝需要的軟體包,yum util提供yum config manager功能 3. 設置yum源為阿裡雲 4. 安裝docker 5. 安裝查看docker版本 6. 設置 docker鏡象拉取提供者 7. 啟動 ...
  • 前提補充:linux下只要能夠mount存儲盤到目錄,則這個存儲盤必定是格式化過了的 NAS1、客戶端通過TCP/IP協議連接存儲伺服器的存儲捲。2、客戶端 網路交換機 存儲伺服器3、存儲伺服器可以實時看到每個存儲捲的使用率4、傳輸速度受限於網路以及存儲伺服器的文件系統處理速度5、文件系統在存儲短, ...
  • systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall開機啟動 ...
  • 所需器材有:樹莓派及其電源,usb攝像頭,路由器,兩台伺服舵機及其外殼,一臺筆記本,一根網線 樹莓派的基本操作及學習網站與資料 "樹莓派實驗室" "樹莓派3代入門資料及安裝教程" 按照以上操作初始化樹莓派 樹莓派控制攝像頭進行視頻流傳輸,併在pc端接收視頻 推薦使用 "MJPG streamer" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...