午夜网站国产欧美_加勒比视频亚洲无码_91亚洲人人在字幕国产_18禁止美女爆乳免费网站_被消防员c哭高h野外糙汉动漫_午夜精品视频在线无码_gogowww人体大胆裸体午液_2021自拍偷区亚洲综合第一页_国产欧美一区二区精品性色超碰_99國產精品無碼

Hi,您好,歡迎來到西安盛圖軟件科技有限公司!

Linux 文本處理三劍客:grep、sed 和 awk

發(fā)布時間:2024-01-18 16:46:32

awk、grep、sed是linux操作文本的三大利器,合稱文本三劍客,也是必須掌握的linux命令之一。三者的功能都是處理文本,但側重點各不相同,其中屬awk功能最強大,但也最復雜。grep更適合單純的查找或匹配文本,sed更適合編輯匹配到的文本,awk更適合格式化文本,對文本進行較復雜格式處理。

grep
Linux 系統(tǒng)中 grep 命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。grep全稱是 Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。

grep可用于shell腳本,因為grep通過返回一個狀態(tài)值來說明搜索的狀態(tài),如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。

命令的基本格式:
即便不熟悉這個命令,應該大多數同學也用過查詢進程的命令:
這就是 grep 的一個基本用法,從所有進程中搜索某個進程。
grep 常用的參數如下:

前三個 A、B、C 參數很容易理解,舉個栗子,假設我們有一個文件,文件名是 test,內容是從 1 到 9,每個數字一行:
-A2 7 的效果就是找到 7 ,然后輸出 7 后面兩行。
同理,-B2 7-C2 7就是找到 7 ,然后分別輸出 7 前面兩行和前后兩行:
繼續(xù),假設我們有個名叫 test 的文件內容如下:
grep -c命令的作用就是輸出匹配到的行數,比如我們想找包含aaa的有幾行,一眼就能看出來有兩行,第一行和第三行都包含:


grep -e命令是實現多個匹配之間的關系,比如我們想找包含aaaa或者bbbb的,顯然應該返回第一行和第二行:

grep -F相當于fgrep命令,就是將pattern視為固定字符串。比如搜索'aa*'不帶-F和帶上,區(qū)別如下:


可以看到第二次就找不到了,因為搜索的是 aa*這個字符串,而不是正則表達式。
grep -f 文件名的使用方法是把后面這個文件里的內容當做pattern。比如我們有個文件,名字是 grep.txt,然后內容是aa*,使用方法如下:
實際上等同于grep 'aa*' test
grep -i --ignore-case作用是忽略大小寫。
grep -n顯示匹配的行號,就是多顯示了個行號,不用細說。
grep -o僅顯示匹配到的字符串,還是用剛才的aa*距離,之前顯示的都是匹配到的字符所在的整行,這個命令是只顯示匹配到的字符:
grep -q不打印匹配結果。剛看到這個我疑惑了半天,讓你搜索字符串,你不給我結果那有啥用?然后發(fā)現還有一條很多教程沒說:如果有匹配的內容則立即返回狀態(tài)值 0。所以一般用在shell腳本中,在 if 判斷里面。
grep -s不顯示錯誤信息,不解釋。
grep -v顯示不被匹配到的行,相當于[^]反向匹配,最常見的還是用在查找線程的命令里,有時候會打印grep線程,可以再加上這么一個去除自己:
  1. ? ps -ef|grep Typora

  2.   501 91616     1   0 五11上午 ??        13:39.32 /Applications/Typora.app/Contents/MacOS/Typora

  3.   501 14814 93748   0  5:33下午 ttys002    0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn Typora

  4.  

  5. ? ps -ef|grep Typora|grep -v grep

  6.   501 91616     1   0 五11上午 ??        13:39.32 /Applications/Typora.app/Contents/MacOS/Typora


可以看到第二次就沒有打印grep線程自身
grep -w匹配整個單詞,只有完全符合pattern的單次才會匹配到:
可以看到第二次結果為空,因為沒有aaa這個單詞。
關于正則的高級用法就不再深入研究了,改日再統(tǒng)一整理。

sed

sed 命令的作用是利用腳本來處理文本文件。使用方法:
參數說明:
  • -e<script>或--expression=<script> 以選項中指定的 script 來處理輸入的文本文件,這個-e可以省略,直接寫表達式。
  • -f<script文件>或--file=<script文件>以選項中指定的 script 文件來處理輸入的文本文件。
  • -h或--help顯示幫助。
  • -n 或 --quiet 或 --silent 僅顯示 script 處理后的結果。
  • -V 或 --version 顯示版本信息。
動作說明:
  • a:新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
  • c:取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d:刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;
  • i:插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p:打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
  • s:取代,通常這個 s 的動作可以搭配正規(guī)表示法,例如 1,20s/old/new/g 。
我們先準備一個文件,名為test做測試,內容如下:

增加內容

使用命令sed -e 3a\newLine testfile這個命令的意思就是,在第三行后面追加newLine這么一行字符,字符前面要用反斜線作區(qū)分。執(zhí)行完畢之后可以看到結果:
但是注意,這個只是將文字處理了,沒有寫入到文件里,文件里還是之前的內容。
其實 a 前面是可以匹配字符串,比如我們只想在出現 Linux 的行后面追加,就可以:sed -e /Linux/a\newline test 兩個斜線之間的內容是需要匹配的內容??梢钥闯?,只有第二、第四行有Linux,所以結果如下:
這里用雙引號把整個表達式括起來也可以,還方便處理帶空格的字符。
sed -e /Linux/a\newline test等效于sed "/Linux/a newline" test
插入內容
跟 a 類似,sed 3i\newline test是在第三行前面插入newline:
sed /Linux/i\newline test是在所有匹配到Linux的行前面插入:
可以看出插入的用法和增加很相似。

上一篇:C、C++、QT 中的字符串格式和處理方法
下一篇:Linux開發(fā)工具

歡迎登錄盛圖科技

歡迎注冊盛圖科技

已有賬號,立即登錄