Linux 三劍客-grep、awk、sed

grep

grep [-acinv] [--color=auto] '搜尋字符串' filename
	-a: 將 binary 文件以 text 文件方式搜尋數據
	-c: 計算找到 '搜尋字符串' 的數據
	-i: 忽略大小寫的不同,所以大小寫視爲相同
	-o : only,只顯示匹配的內容,其他不作輸出
	-n: 順便輸出行號
	-v: 反向選擇,亦即顯示出沒有 '搜尋字符串' 的那一行
	--color=auto: 將查找到的 '搜尋字符串' 加上顏色,高亮顯示

grep nginx /etc/passwd

參考文檔

shell grep 的結果只取第一行
Linux下使用grep,tail 查看查找日誌
linux 下利用ls grep 和正則表達式實現目錄和文件的分開顯示
grep 文本過濾
《鳥哥的Linux私房菜-基礎學習篇 第四版》 10.6.1 擷取命令: cut, grep
《鳥哥的Linux私房菜-基礎學習篇 第四版》 11.2.2 grep 的一些進階選項

awk

awk——按列處理數據

  • -F :分隔符

awk 通常運作的模式是這樣的:

 awk '條件類型 1{動作 1} 條件類型 2{動作 2} ...' filename

awk 後面接兩個單引號並加上大括號 {} 來設定想要對數據進行的處理動作。 awk 可以處理後續接的文件,也可以讀取來自前個指令的 standard output 。 但如前面說的, awk 主要是處理『每一行的字段內的數據』,而默認的『字段的分隔符爲 “空格鍵” 或 “[tab]鍵” 』 !

在 awk 的括號內, 每一行的每個字段都是有變量名稱的,那就是 $1, $2… 等變量名稱。以上面的例子來說, dmtsai 是 $1 ,因爲他是第一欄嘛!至於 192.168.1.100是第三欄, 所以他就是 $3 啦!後面以此類推~呵呵!還有個變數喔!那就是 $0 , $0 代表『一整列資料』的意思~以上面的例子來說,第一行的 $0 代表的就是『 dmtsai … 』那一行啊!

# last -n 5: 使用last指令取出登錄用戶,只取前5行
# awk '{print $1 "\t" $3}': 以空格(默認)爲分隔符,打印(print)出第一列($1)和第三列($3)的數據,
# 並以"\t"爲分隔符進行顯示
last -n 5 | awk '{print $1 "\t" $3}'

awk 是『 以行爲一次處理的單位』, 而『 以字段爲最小的處理單位』。

awk的默認變量

變量名稱 代表意義
FILENAME 當前文件名
NF Num Field,每一行 ($0) 擁有的字段總數;NF表示字段總數,$NF表示最後一個字段,$(NF-1)表示倒數第二個字段
NR Num Row,目前 awk 所處理的是『第幾行』數據
FS Field Split,字段分隔符,默認是空格或製表符,也可使用-F參數指定
RS Row Split,行分隔符,用於分割每一行,默認是換行符。
OFS Output Field Split,輸出字段的分隔符,用於打印時分隔字段,默認爲空格
ORS Output Row Split,輸出記錄的分隔符,用於打印時分隔記錄,默認爲換行符。
OFMT 數字輸出的格式,默認爲%.6g
# last -n 5: 使用last指令取出登錄用戶,只取前5行
# awk '{print $1 "\t lines: " NR "\t columns: " NF}': 以空格(默認)爲分隔符,拆分前面命令的輸出,
# 並以\t爲分隔符,打印出對應變量的數據
# 並以"\t"爲分隔符進行顯示
last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'

awk 的邏輯運算字符

運算單元 代表意義
> 大於
< 小於
>= 大於或等於
<= 小於或等於
== 等於
!= 不等於
# {FS=":"}, 以:爲分隔符進行分割,從第二行開始生效
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'

# BEGIN {FS=":"}, 以:爲分隔符進行分割,從第一行開始生效,BEGIN表示預設變量
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'

函數

條件

if語句

awk提供了if結構,用於編寫複雜的條件。

# 以":"爲分隔符,查找demo.txt(/etc/passwd文件的備份)文件中第一列大於m的字段並輸出
awk -F ':' '{if ($1 > "m") print $1}' demo.txt

if結構還可以指定else部分。

awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt

參考文檔

Linux三劍客之awk命令
awk 入門教程
AWK程序設計語言

sed

sed [-nefr] [動作]

選項與參數:

  • -n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到屏幕上。但如果加上 -n 參數後, 則只有經過 sed 特殊處理的那一行(或者動作)纔會被列出來。
  • -e :直接在指令列模式上進行 sed 的動作編輯;
  • -f :直接將 sed 的動作寫在一個文件內, -f filename 則可以執行 filename 內的 sed 動作;
  • -r : sed 的動作支持的是延伸型正規表示法的語法。 (預設是基礎正規表示法語法)
  • -i :直接修改讀取的文件內容,而不是由屏幕輸出。

動作說明: [n1[,n2]]function

  • n1, n2 :不見得會存在,一般代表『 選擇進行動作的行數』, 舉例來說,如果我的動作是需要在 10 到 20 行之間進行的, 則『10,20[動作行爲] 』

function 有底下這些咚咚:

  • a :新增, a 的後面可以接字符串,而這些字符串會在新的一行出現(目前的下一行)~
  • c :取代, c 的後面可以接字符串, 這些字符串可以取代 n1,n2 之間的行!
  • d : 刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
  • i :插入, i 的後面可以接字符串,而這些字符串會在新的一行出現(目前的上一行);
  • p :打印,即將某個選擇的數據打印。通常 p 會與參數 sed -n 一起運行
  • s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!
    例如 1,20s/old/new/g 就是啦!

以行爲單位的新增/刪除功能

以行爲單位的取代與顯示功能

nl /etc/passwd | sed '2,5c No 2-5 number'	# 取代 nl /etc/passwd 命令輸出結果的 2-5 行爲 'No 2-5 number'

nl /etc/passwd | sed '5,7p'					# 打印 nl /etc/passwd 命令的輸出,其中 5-7 的內容會重複輸出
nl /etc/passwd | sed -n '5,7p'				# 使用安靜模式打印 nl /etc/passwd 命令的輸出,僅打印 5-7 行的內容

部分數據的搜尋並取代的功能

sed ‘s/要被取代的字符串/新的字符串/g’——sed工具替換的標準格式

# 替換 ifconfig wlp2s0 | grep 'netmask' 命令的輸出結果中 'inet ' 部分內容爲 ''
# 其中 '^.*inet '爲進行匹配的正則表達式
ifconfig wlp2s0 | grep 'netmask' | sed 's/^.*inet //g'	

# 替換 ifconfig wlp2s0 | grep 'netmask' 命令的輸出結果中 'inet ' 部分內容爲 '', 
# '  netmask 255.255.255.0  broadcast 192.168.0.255' 部分內容爲'',
# 其中 '^.*inet ', ' *netmask.*$'爲進行匹配的正則表達式
ifconfig wlp2s0 | grep 'netmask' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'

直接修改文件內容(危險動作)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章