1. 程式人生 > >linux 下的shell 文字處理工具

linux 下的shell 文字處理工具

        grep、sed和awk都是文字處理工具,雖然都是文字處理工具單卻都有各自的優缺點,一種文字處理命令是不能被另一個完全替換的,否則也不會出現三個文字處理命令了。只不過,相比較而言,sed和awk功能更強大而已,且已獨立成一種語言來介紹。

一、grep 與egrep

grep:文字過濾器,如果僅僅是過濾文字,可使用grep,其效率要比其他的高很多。

1. grep 的常用命令

-i 忽略字母大小寫
-v 條件取反
-c 統計匹配行數
-q 靜默,無任何輸出
-n 顯示匹配結果所在的行號

忽略大小寫:

反向過濾:過濾掉沒有‘l’ 的行

統計匹配行數:

2. 正則表示式

        由一類特殊字元及文字字元所編寫的模式,其中有些字元不表示字元的字面意思,而表示控制或通配的功能。

^:匹配開頭

匹配以大寫字母‘A’ 開頭的行

匹配多個條件時,要用egrep

匹配以字母‘a’ 開頭或者‘d’ 開頭的行

此時,不能有空格,否則會對所需匹配的內容再加上空格進行匹配

匹配檔案中是否包含關鍵字,其中 && 代表前一條命令執行成功所要執行的內容,|| 代表前一條命令執行失敗所要執行的內容

加上 -q 靜默輸出,只顯示結果

egrep -m10 :只對前10行內容進行匹配

$:匹配結尾

.:匹配任意字元

過濾非空行

擷取空行:

方法一:反向擷取任意字元的行,擷取沒有字元的行

方法二:擷取以空為開頭,以空為結尾的行

擷取以某一內容至少出現一次的行

擷取某一內容或者某一內容後再加某內容的行

擷取,某一內容連續出現幾次的行

擷取a 出現2到4次的行

擷取a 出現3次以上的行

擷取a, 和 aA 的行

擷取大寫字母A 到Z 的行

3. cut 命令

擷取以冒號為分隔符,1到3列的內容

擷取1和4列的字元

 

練習三:利用文字處理方式,顯示ip 地址

以空格為分隔符,顯示第10列的資訊即為ip 地址

 

練習四:編寫指令碼,測試能否與某一ip 地址進行通訊,若能顯示up ,否則顯示down

ping -c 為幾次後停止, -w 為間隔幾毫秒

其中,/dev/null  : 在類Unix系統中,/dev/null,或稱空裝置,是一個特殊的裝置檔案,它丟棄一切寫入其中的資料(但報告寫入操作成功),讀取它則會立即得到一個EOF。
在程式設計師行話,尤其是Unix行話中,/dev/null 被稱為位桶(bit bucket)或者黑洞(black hole)。空裝置通常被用於丟棄不需要的輸出流,或作為用於輸入流的空檔案。當你讀它的時候,它會提供無限的空字元(NULL, ASCII NUL, 0x00)。

4. sort 命令

-n 純數字排序
-r 倒序排序
-u 去掉重複數字
-o 輸出到指定檔案中
-t 指定分隔符
-k

指定要排序的列

顯示cpu 使用率最高的5個程序的id 號和其cpu 使用率

按每一列的字元進行排序

按數字到小排序

去掉重複數字,並按數字大小進行排序

指定分隔符為: ,並對第3列的數字大小進行排序

對排序結果進行儲存

5. uniq 命令

該命令可對重複字元進行處理

-u 顯示唯一的行
-d 顯示重複的行
-c

每行顯示一次並統計重複次數

先排序,再去除重複的行

先排序,再顯示重複的行

 

練習五:將目錄內最大的檔案其名稱顯示出來

6. test 命令

test “$a” == "$b" 等同於 [ "$a" == "$b" ]    ##判斷等於

[ "$a" != "$b" ]    ##判斷不等於

對整數進行判斷也可以用如下方式:

[ "$a" -eq "$b" ]    ##判斷等於

[ "$a" -ne "$b" ]    ##判斷不等於

[ "$a" -le "$b" ]    ##判斷小於等於

[ "$a" -ge "$b" ]    ##判斷大於等於

[ "$a" -gt "$b" ]    ##判斷大於

[ "$a" -lt "$b" ]    ##判斷小於

[ "$a" -ne "$b" -a “$a” -gt "$b" ]    ##兩個條件需同時滿足

[ "$a" -ne "$b" -o “$a” -gt "$b" ]    ##兩個條件至少滿足一個

判斷一個變數是否為空:[ -z "$a" ]

對檔案型別進行判斷:

[ -e "file" ]    ##是否存在

[ -f "file" ]    ##普通檔案

[ -b "file" ]    ##塊裝置

[ -S "file" ]    ##套接字

[ -c "file" ]    ##字元裝置

[ -L "file" ]    ##軟連結

 

練習六:編寫指令碼檔案,判斷輸入的數字是否為空,同時是否小於等於10,且大於1

練習七:編寫指令碼,輸入檔名,並判斷檔案型別

7. exit 命令

exit  0:正常執行程式並退出程式;

exit  1:非正常執行導致退出程式;

exit 0 可以告知你的程式的使用者:你的程式是正常結束的。如果 exit 非 0 值,那麼你的程式的使用者通常會認為你的程式產生了一個錯誤。

 

二、sed

sed:Stream EDitor,流編輯器,預設只處理模式空間,不處理原資料,如果你處理的資料是針對行進行處理的,可以使用sed。一次處理一行內容,處理時,把當前的行儲存在臨時緩衝區,處理完後,輸送到螢幕。

1. sed 命令引數

sed  [引數]  ' 命令 ' file

命令:

p    ##顯示

d    ##刪除

a    ##新增

c    ##替換

i    ##插入

引數:

-n    ##靜默輸出

2. 顯示(p)

顯示有:的行

顯示以# 開頭的行

顯示不以# 開頭的行

顯示2到6行

顯示第2和第6行

3. 刪除(d)

刪除以UUID 為開頭的行

刪除空行

刪除1到4行

4. 新增(a)

在有hello 的那行後新增一行westos

5. 替換相應內容(s)

把內容替換為其他內容

把hello 替換為hello 換行 world

6. 替換整行(c)

用sss 替換有world 的那一行

7. 插入(i)

在有hello 的那一行前面,插入world 換行 westos

8. 儲存相應修改(-i)

儲存修改至原檔案

練習八:編寫指令碼,將http 服務的埠號改為相應的值

埠號已被更改

 

三、awk

awk:報告生成器,格式化以後顯示。如果對處理的資料需要生成報告之類的資訊,或者你處理的資料是按列進行處理的,最好使用awk。根據模式一次從檔案中抽取一行文字,對這行文字進行切片(預設使用空白字元作為分隔符)。

1. 輸出相應的列

預設以空格為分隔符,輸出第1列

輸出整行

輸出第一列與第二列,並以空格隔開

2. 指定分隔符(-F)

3. 輸出檔名,行號和列號(FILENAME,NR,NF)

輸出檔名與行號

輸出行號與列號

4. 文字處理前後所執行的語句

開始前:BEGIN { }:讀入第一行文字之前執行的語句,一般用來初始化操作

結束後:END { }

對以bash 為結尾的行進行輸出

輸出第3行

輸出偶數行

以:為分隔符,輸出第三列大於等於0且小於2的行的第1和第3列

列出uid 小於2的使用者資訊

統計文字總欄位數

統計以:為分隔符,第7列是以bash 結尾的行數

分別統計uid 號小於等於500 的個數和大於500 的個數

awk 的迴圈語句