1. 程式人生 > >linux文字處理常用命令

linux文字處理常用命令

linux文字處理命令:grep、sed、printf、awk

1.grep

grep的作用是按行查詢字元,輸出包含字元的行。

#從檔案查詢
grep 'hello' filename.txt
#從管道的輸入查詢
cat filename.txt|grep 'hello'

grep使用示例:

grep的查詢主要就是基於基本正則表示式的匹配,下面只是簡單的給一些常用例子供參考。

grep 't[ae]st'   //查詢tast或test

grep '[0-9]'   //查詢數字

grep '[^a-z]oo' //查詢Xoo,其中X是一個非a到z的字元

grep '^the'  //查詢以the開頭的字元,這裡注意區分^出現在[]裡時代表“非某字元”,如上個例子,出現在[]外時代表"以某字元開頭",如這個例子。

grep '^$'  //查詢空行

grep 'o\{2\}'  //查詢兩個o,這裡需要注意,{}在shell裡有特殊意義,因此需要轉義,這裡與一般的正則使用不同,需要注意。

egrep:

我們知道正則表示式分為基本正則表示式和擴充套件正則表示式,但是grep只支援基本正則表示式,如果要是用擴充套件正則表示式,需要使用egrep命令。

幾個例子:

egrep 'gd|good'  //查詢gd或good

egrep 'g(la|oo)d'  //查詢glad或good

egrep 'A(xyz)+C'  //查詢AXC,其中X是一個或一個以上的'xyz'字串。

2.sed

sed是一個很強大的命令,可以用來做行刪除

行新增行選取行替換字串的替換這5種操作。

sed是一個管道命令,可以處理管道輸入。

2.1行刪除

nl /etc/passwd | sed '2d'  //刪除第2行

下面將省略輸入管道

sed '2,5d'  //刪除第2~5行

sed '3,$d'  //刪除第3到最後一行,$代表最後一行

sed '/^$/d'  //刪除空行

2.2行新增

sed '2a drink tea'  //在第二行下面追加一行"drink tea",a代表append

sed '2i drink tea'  //在第二行上面插入一行"drink tea",i代表insert

sed '2a a\

b\

c'  //在第二行下面追加三行 "a"、"b"、"c",只需要每行結尾加"\"即可。

2.3行選取

sed -n '5,7p'  //選取第5到7行輸出,必須加-n引數,不然效果就是所有行都被輸出,而5到7行輸出兩次。

2.4行替換

sed '2,5c No 2~5 lines'  //將第2到5行替換為一行字串"No 2~5 lines"

2.5字串替換

sed 's/要被替換的字串/新的字串/g'  //固定的格式,開頭是s結尾是g,中間三個/分隔開要被替換的字串和新的字串,注意這裡要被替換的字串可以是正則表示式。

sed -i  's/hello/halo/g'  filename.txt

將操作結果直接寫入檔案

預設用sed對檔案做修改之後,只是輸出修改後的檔案,可以用>寫入到新的檔案。但是如果想修改原始檔案,千萬不能>到原始檔案,這樣執行的結果就是原檔案直接被清空了。想要修改原始檔案可以用 -i 引數,如:

sed -i '2d' file.txt  //直接將原檔案中的第二行刪除。

直接修改原檔案是很危險的,一旦修改錯誤無法還原。可以先不加 -i 引數執行命令把修改結果打印出來,確認無誤後再加上 -i 引數。

3.printf

printf這個命令用語言不太好描述,但是一動手就明白了。

把下面的內容儲存為printf.txt:

Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33

先cat看一下,是下面這個效果:

現在用printf指令加一些引數來看一下,執行

printf '%10s %10s %10s %10s %10s \n' `cat printf.txt`

輸出結果:

是不是比cat輸出的結果漂亮多了。

%10s代表這一列的寬度固定為10個字元。更多的格式就不介紹了,這篇文章我們掌握一個%10s就夠了。

printf不是管道命令,要想用它處理檔案必須像上面的命令那樣使用`cat printf.txt`把檔案內容給提出來。

printf的使用相當廣泛,後面的awk命令中也會應用到printf命令。

4.awk

awk命令主要是將檔案通過分隔符拆成列來處理,還能通過條件判斷對不同的行進行不同的處理,甚至還可以進行數值計算~

我們也是通過例子來學習。

我們先用last命令看一下最後登入的5個使用者資訊:

圖中的第一列是使用者名稱,第三列是使用者ip,現在我們想摘出這兩列,用awk就可以做到:

last -5|awk '{print $1 "\t" $3}'

輸出:

命令看起來挺複雜,不要著急,其實很簡單。

首先awk使用時有固定的格式:awk '{命令}',單引號和大括號就是固定的格式而已。

然後上面的命令就是

print $1 "\t" $3    //awk預設會用空格和tab將每行分隔為N列,$1代表第一列,$3代表第三列。

這樣一看是不是簡單多了。

剛剛的last命令產生的資料預設就是用tab分隔的,現在我們看另一個例子,執行 cat /etc/passwd:

這次產生的資料每行是用  : 分隔的,那麼想使用awk輸出第一列和第三列就需要執行分隔符:

cat /etc/passwd|awk -F ':' '{print $1 "\t" $3}'    // -F ':' 代表指定使用 : 作為分隔符

執行結果:

除了$1,$3這樣的特殊符號,

awk的命令中還可以使用下面的特殊符號:

NF :每一行分隔後的列數

NR :行號

下面用一個綜合的例子來說明awk的條件判斷和數值計算,有這樣一組資料儲存為pay.txt:

Name    1st   2nd   3rd
VBird   23000   24000  25000
DMTsai  21000   20000  23000
Bird2   43000   42000  41000

現在想加一列"Total",計算每一行的數值總和。

用awk可以完成這個需求:

cat pay.txt |awk 'NR==1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,"Total"};NR>1 {printf "%10s %10s %10s %10s %10s \n",$1,$2,$3,$4,$2+$3+$4}'

執行結果:

這裡有幾個要點:

  1. 加入條件判斷後,awk的格式為: awk '條件1 {命令1};條件2{命令2}'
  2. 條件判斷有以下邏輯運算:
    • >
    • <
    • >=
    • <=
    • ==  //注意判斷相等要用兩個等號
    • !=
  3. 可以直接運算行內列的值($1、$2、$3)。