1. 程式人生 > 其它 >05-文字處理三劍客

05-文字處理三劍客

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}'                                       //不顯示第一行