Linux-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'