05-文字處理三劍客
阿新 • • 發佈:2022-03-31
grep
grep -A 顯示匹配指定內容及之後的n行
grep -B 顯示匹配指定內容及之前的n行
grep -C 顯示匹配指定內容及其前後各n行
root@ubuntu2004:~# ifconfig ens33 |grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}'
192.168.80.181
255.255.255.0
192.168.80.255
touch {a..z}{A..Z}.txt
留乾貨
cat /etc/profile |grep [a-Z] |grep -v "#"
cat /etc/profile |grep -v "^$" |grep -v "#"
egrep -v "(^#|^$)" /etc/profile
root@ubuntu2004:/data# echo chuan-du |grep "\<chuan\>" chua-du root@ubuntu2004:/data# echo chuan:du |grep "\<chuan\>" chuan:du root@ubuntu2004:/data# echo chuandu |grep "\<chuan\>" root@ubuntu2004:/data# echo chuan_du |grep "\<chuan\>"
sed
sed 是一種線上編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有 改變,除非你使用重定向儲存輸出。Sed主要用來自動編輯一個或多個檔案;簡化對檔案的反覆操作;編寫轉換程式等。
-n 不輸出模式空間內容到螢幕,即不自動列印 -e 多點編輯 -f FILE 從指定檔案中讀取編輯指令碼 -r, -E 使用擴充套件正則表示式 -i.bak 備份檔案並原處編輯 -s 將多個檔案視為獨立檔案,而不是單個連續的長檔案流 #說明: -ir 不支援 -i -r 支援 -ri 支援 -ni 危險選項,會清空檔案
sed -i "s/ens33/eth0/g" ./a.sh #全文搜尋替換
sed -i 's/.*swap.*/#&/' /etc/fstab #永久關閉交換分割槽
sed -i.bak '/SELINUX=enforcing/c SELINUX=disabled' /etc/sysconfig/selinux #直接替換並備份
sed -i "/^#/d" fstab #刪除#開頭
sed -i '/^$/d' fstab #刪除空行
sed -i "/8ede\-f85b68344815 \/boot/a\CHUAN" /etc/fstab #boot後怎加一行
sed -i "/8ede\-f85b68344815 \/boot/i\GE" /etc/fstab #boot前怎加一行
awk
awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理
awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。預設域分隔符是"空白鍵" 或 "[tab]鍵"
awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file [-F|-f|-v] 大引數,-F指定分隔符,-f呼叫指令碼,-v定義變數 var=value ' ' 引用程式碼塊 BEGIN 初始化程式碼塊,在對每一行進行處理之前,初始化程式碼,主要是引用全域性變數,設定FS分隔符 // 匹配程式碼塊,可以是字串或正則表示式 {} 命令程式碼塊,包含一條或多條命令 ; 多條命令使用分號分隔 END 結尾程式碼塊,在對每一行進行處理之後再執行的程式碼塊,主要是進行最終計算或輸出結尾摘要資訊 特殊要點: $0 表示整個當前行 $1 每行第一個欄位 NF 欄位數量變數 NR 每行的記錄號,多檔案記錄遞增 FNR 與NR類似,不過多檔案記錄不遞增,每個檔案都從1開始 \t 製表符 \n 換行符 FS BEGIN時定義分隔符 RS 輸入的記錄分隔符, 預設為換行符(即文字是按一行一行輸入) ~ 匹配,與==相比不是精確比較 !~ 不匹配,不精確比較 == 等於,必須全部相等,精確比較 != 不等於,精確比較 && 邏輯與 || 邏輯或 + 匹配時表示1個或1個以上 /[0-9][0-9]+/ 兩個或兩個以上數字 /[0-9][0-9]*/ 一個或一個以上數字 FILENAME 檔名 OFS 輸出欄位分隔符, 預設也是空格,可以改為製表符等 ORS 輸出的記錄分隔符,預設為換行符,即處理結果也是一行一行輸出到螢幕 -F'[:#/]' 定義三個分隔符
-F指定分隔符 $1 指指定分隔符後,第一個欄位,$3第三個欄位, \t是製表符 一個或多個連續的空格或製表符看做一個定界符,即多個空格看做一個空格 awk -F":" '{print $1}' /etc/passwd awk -F":" '{print $1 $3}' /etc/passwd //$1與$3相連輸出,不分隔 awk -F":" '{print $1,$3}' /etc/passwd //多了一個逗號,$1與$3使用空格分隔 awk -F":" '{print $1 " " $3}' /etc/passwd //$1與$3之間手動新增空格分隔 awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd //自定義輸出 awk -F: '{print NF}' /etc/passwd //顯示每行有多少欄位 awk -F: '{print $NF}' /etc/passwd //將每行第NF個欄位的值打印出來 awk -F: 'NF==4 {print }' /etc/passwd //顯示只有4個欄位的行 awk -F: 'NF>2{print $0}' /etc/passwd //顯示每行欄位數量大於2的行 awk '{print NR,$0}' /etc/passwd //輸出每行的行號 awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd //依次列印行號,欄位數,最後欄位值,製表符,每行內容 awk -F: 'NR==5{print}' /etc/passwd //顯示第5行 awk -F: 'NR==5 || NR==6{print}' /etc/passwd //顯示第5行和第6行 route -n|awk 'NR!=1{print}' //不顯示第一行