做爲一個偏心windows的程序員,之前作文本處理的時候老是喜歡在windows下用notepad++等圖形化工具處理,好比有時須要把linux服務器上一個文件進行一次全局字符串替換這樣簡單的操做,還得把文件down到本地編輯好再傳回去。這兩天買了本《鳥哥的Linux私房菜》,終於靜下心繫統的學習了一下linux下的文本處理,感受其實沒有想象的難,若是早點學會節約下來的大量時間確定遠超過學習所花的時間。linux
先說一下本文要介紹的內容:程序員
下面正式開始。正則表達式
這部分是給會正則表達式的讀者簡單回顧一下正則表達式,若是沒學過正則表達式的讀者建議先找相關資料學習正則表達式再來看本文。shell
正則表達式分爲基本正則表達式和擴展正則表達式,內容以下:windows
正則表達式字符 | 含義 |
^word | 查找以word開頭的文本 |
word$ | 查找以word結尾的文本 |
. | 表明一個任意字符 |
\ | 轉義符 |
* | 0到多個字符 |
[abc] | 表明一個字符,這個字符是a或b或c |
[a-z];[0-9] | 表明a到z中的一個字符;0到9中的一個數字 |
[^abc] | 表明一個非a、b、c的字符 |
{m,n} | m到n個字符 |
正則表達式字符 | 含義 |
+ | 一個或多個字符 |
? | 零個或一個字符 |
| | 或者 |
() | 分組 |
grep的做用是按行查找字符,輸出包含字符的行。bash
grep用法:服務器
grep通常有兩種用法,一種是從文件查找,一種是從管道的輸入查找,app
grep的經常使用參數:工具
參數 | 含義及示例 |
-n | 輸出結果加行號 |
--color=auto | 匹配的關鍵字高亮顯示 |
-A3 | 輸出匹配行的後三行 |
-B2 | 輸出匹配行的前兩行 |
-v | 反向查找,即輸出不包含關鍵字的行 |
-i | 關鍵字匹配時忽略關鍵字大小寫 |
grep使用小技巧:學習
多數狀況咱們都想要高亮關鍵詞(使用--color=auto參數),所以能夠在~/.bashrc文件中添加上:
alias grep='grep --color=auto'
,再用
source ~/.bashrc
讓配置生效。這樣當咱們使用grep的時候,就自動帶了--color=auto參數。
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'字符串。
sed是一個很強大的命令,能夠用來作行刪除、行新增、行選取、行替換和字符串的替換這5種操做。
sed是一個管道命令,能夠處理管道輸入。
1.行刪除
nl /etc/passwd | sed '2d' //刪除第2行
下面將省略輸入管道
sed '2,5d' //刪除第2~5行
sed '3,$d' //刪除第3到最後一行,$表明最後一行
sed '/^$/d' //刪除空行
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",只須要每行結尾加"\"便可。
3.行選取
sed -n '5,7p' //選取第5到7行輸出,必須加-n參數,否則效果就是全部行都被輸出,而5到7行輸出兩次。
4.行替換
sed '2,5c No 2~5 lines' //將第2到5行替換爲一行字符串"No 2~5 lines"
5.字符串替換
sed 's/要被替換的字符串/新的字符串/g' //固定的格式,開頭是s結尾是g,中間三個/分隔開要被替換的字符串和新的字符串,注意這裏要被替換的字符串能夠是正則表達式。
將操做結果直接寫入文件
默認用sed對文件作修改以後,只是輸出修改後的文件,能夠用>寫入到新的文件。可是若是想修改原始文件,千萬不能>到原始文件,這樣執行的結果就是原文件直接被清空了。想要修改原始文件能夠用 -i 參數,如:
sed -i '2d' file.txt //直接將原文件中的第二行刪除。
直接修改原文件是很危險的,一旦修改錯誤沒法還原。能夠先不加 -i 參數執行命令把修改結果打印出來,確認無誤後再加上 -i 參數。
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命令。
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}'
運行結果:
這裏有幾個要點:
這篇文章首先回顧了正則表達式(基本正則表達式、擴展正則表達式),而後介紹了4個經常使用命令,最後咱們概括一下四個命令的用途:
命令 | 用途 |
grep/egrep | 關鍵字查找 |
sed |
|
printf | 文件格式化輸出 |
awk |
|
參考資料:
《鳥哥的Linux私房菜 基礎學習篇(第三版)》 第12章