Linux常用文字命令:grep、sed、awk 、cut、tr、wc、uniq、sort
grep
grep指令用於查詢內容包含指定的範本樣式的檔案,如果發現某檔案的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。
grep常用引數:
-B num : 除了顯示符合樣式的那一行之外,並顯示該行之前的num行內容。before -A num :除了顯示符合樣式的那一行之外,並顯示該行之前的num行內容。after -C num:除了顯示符合樣式的那一行之外,並顯示該行之前後num行內容。 -c :計算符合樣式的列數 -d 動作: 當指定要查詢的是目錄而非檔案時,必須使用這項引數,否則grep指令將回報資訊並停止動作。 -e :實現多個選項間的邏輯or關係.-n :在顯示符合樣式的那一行之前,標出該行的列數編號,即顯示行號; -E :使用擴充套件的正則表示式 \egrep。 -i :忽略字元大小寫的差別。 -o :只顯示匹配的字串部分。 -v :顯示不包含匹配文字的所有行。 -V :顯示版本資訊 -s :不顯示錯誤資訊。
練習:
1.選取出"ip a"命令的ipv4地址 # ip a|grep "\<inet\>"|grep -E -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"
sed
前言:
1.sed是非互動式的編輯器。它不會修改檔案,除非使用shell重定向來儲存結果。預設情況下,所有的輸出行都被列印到螢幕上。
首先sed把當前正在處理的行儲存在一個臨時快取區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行傳送到螢幕上。
sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed便結束執行。
sed把每一行都存在臨時緩衝區中,在緩衝區中對這個副本進行編輯,將處理後的行輸出到螢幕上,但不會修改原檔案,除非使用-i引數。
3.sed可以對檔案進行過濾,也可以進行修改。
4.sed是一種語言,awk是一種語言,bash也是一種語言。 5.sed是對文字一行一行進行處理的,若不加地址定界,或地址定界匹配不帶,則預設會一行一行的匹配處理文字內容,直到結束。 sed用法:[option]常用選項: -n:不輸出模式空間內容到螢幕,即不自動列印。 -e:多點編輯。 -f /path/script_file:從指定的檔案中讀取編輯指令碼。 -r:支援使用擴充套件正則表示式。 -i.bak:備份原檔案,備份後在原檔案處進行內容修改。(-i.bak是因為sed命令使用-i引數時不會詢問,怕改錯,有一定的危險性,因此-i.bak是在修改前先備份原檔案,然後再修改該檔案,一定程度上減少了出錯風險。) 'script'即'地址命令':sed自身的語言指令碼。 'script'='地址定界 + 編輯命令',若不加地址定界,則預設處理文字中的所有行。 '地址定界: ①不給地址,則對全文進行處理。 ②單地址: # :指定的行; $ :最後一行。 /pattern/ :搜尋文字中包含"pattern"的所有行。 ③地址範圍(哪行到哪行)[#代表行號,/pat/代表比包含有pat的首行]: #,# #,+# /pat1/,/pat2/ #,/pat1/ ③~:步進 1~2:奇數行 2~2:偶數行 編輯命令': d:刪除模式空間匹配的行,並立即進行下一輪迴圈。 p:列印當前模式空間內容,追加到預設輸出之後。 a[\]text:在指定文字/行的後面追加text內容。(在該行的下一行追加文字),支援使用"\n"實現多行追加。[\]只是方便辨別,實際命令中並不使用它,只需"a內容"或a\內容。 i[\]text:在指定文字/行前插入text內容。(在該行的上一行插入文字)。[]只是方便辨別,實際命令中並不使用它,只需"i內容"即可,或便於區分可i\text。 c[\]text:替換單行或多行為text內容,c內容,或c\內容。 w /path/somefile:儲存模式匹配的行到指定檔案中。 r /path/somefile:讀取指定檔案的內容,至模式空間中匹配到的行的後面。 =:為模式空間中的行列印行號。 !:為模式空間中匹配行取反處理。
'sed工具'
's///':查詢替換,支援使用其他分隔符,s@@@,s%%%
替換標記:
g:行內全部替換
p:顯示替換成功的行
w /path/to/somefile:將替換成功的行儲存至檔案中。
練習:原文字內容:
[root@localhost gaokai]# cat test.sh function look() { echo "this is a test4335" awdadAWDAaaw97979879722aaa awdadAWDAaaw97979879722aaa -------------------------------------------- 1.列印1,2行模式空間的內容,並追加到預設輸出後。 # sed '1,2p' test.sh function look() { function look() { echo "this is a test4335" echo "this is a test4335" awdadAWDAaaw97979879722aaa awdadAWDAaaw97979879722aaa -------------------------------------------- 2.列印1,2行模式空間處理後的內容,不列印原模式空間內容,並輸出 # sed -n '1,2p' test.sh function look() { echo "this is a test4335" --------------------------------------------- 3.不列印模式空間內容,然後將匹配到的行輸出到螢幕上。 # sed -n '/func/,/awd/p' test.sh function look() { echo "this is a test4335" } awdadAWDAaaw97979879722aaa ---------------------------------------------- 4.在第3行行尾新增文字"()_______m",並顯示 # sed '3a()_______m' test.sh function look() { echo "this is a test4335" ()_______m } awdadAWDAaaw97979879722aaa awdadAWDAaaw97979879722aaa
----------------------------------------------
5.在第1行前追加文字"_______m",並儲存後在原處進行編輯。
# sed -i.bak '1i_______m' test.sh
# cat test.sh
_______m
function look() {
echo "this is a test4335"
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa
-----------------------------------------------
6.刪除第2行
# sed '2d' test.sh
echo "this is a test4335"
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa
7.更換第1,3行內容為"this is tihuan",並輸出
# sed '1,3cthis is tihuan' test.sh
this is tihuan
awdadAWDAaaw97979879722aaa
------------------------------------------------
8.在第1至3行後追加"zhui.txt"文字內容,並顯示
#cat zhui.txt
----------
----------
#sed '1,3r zhui.txt' test.sh
function look() {
----------
----------
echo "this is a test4335"
----------
----------
awdadAWDAaaw97979879722aaa
----------
----------
awdadAWDAaaw97979879722aaa
-----------------------------------------------
9.替換行內內容,將單詞"is"替換為大寫"IS"
#sed 's/\<is\>/IS/' test.sh
function look() {
echo "this IS a test4335"
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa
-----------------------------------------------
10.將/etc/default/grub檔案中以"號結尾的行的冒號,替換為xyz"。
# sed -r 's/("$)/xyz\1/' /etc/default/grub
awk
文字報告生成器,逐行處理。
awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。 awk命令樣式及工作流程工作流程
#awk 'BEGIN{action} /pattern/{action} END{action}' filename
- 讀輸入檔案之前執行的程式碼段(由BEGIN關鍵字標識)。
- 主迴圈執行輸入檔案的程式碼段。(執行完BEGIN後,開始讀取檔案,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行END操作。)
- 讀輸入檔案之後的程式碼段(由END關鍵字標識)。
如圖
awk常見使用方式:
#awk -F"分隔符" '/pattern/{action}' filename
練習
1.以":"Wie分隔符,提取/etc/passwd檔案的第一列 #awk -F":" '{print $1}' /etc/passwd 2.只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割。 #awk -F":" '{print $1"\t"$7}' /etc/passwd |sed -n '1,2p' 3.顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以"+"分割。 #awk -F":" '{print $1"+"$7}' /etc/passwd|sed -n '1,2p' 4.顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行之前新增行其中列名為name,shell,在最後一行新增"blue,/bin/nosh"。 #cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' 5.搜尋/etc/passwd以root單詞開頭的行,並顯示該行的使用者名稱和bash(以空格為分隔符)。 # awk -F":" '/^root\>/{print $1" "$7}' /etc/passwd
wc命令
利用wc指令我們可以計算檔案的Byte數、字數、或是列數,若不指定檔名稱、或是所給予的檔名為"-",則wc指令會從標準輸入裝置讀取資料。 在預設的情況下,wc將計算指定檔案的行數、字數,以及位元組數。 格式:#wc [option] file1...[option] -c或--bytes或--chars 只顯示Bytes數,位元組數。 -l或--lines 只顯示行數。 -w或--words 只顯示單詞數。 --help 線上幫助。 --version 顯示版本資訊。
sort命令
作用:用於將文字檔案內容,以行為單位,加以排序。 sort 命令不加任何引數時,將以預設的方式將文字檔案的第一列以ASCII 碼的次序排列,並將結果輸出到標準輸出。 格式:#sort [option] 檔案[option]: -n: 將數值按照從小到大順序排序。。 -r :以相反的順序來排序。 -o <輸出檔案>:將排序後的結果存入指定的檔案。
uniq
用於檢查及刪除文字檔案中重複出現的行列,一般與 sort 命令結合使用,即去重。
uniq不加引數,預設是刪除文字中重複的行。 當重複的行並不相鄰時,uniq 命令是不起作用的。 格式:#uniq [OPTION]... [INPUT [O UTPUT]][opion] -c或--count :在每列旁邊顯示該行重複出現的次數。 -d或--repeated: 僅顯示重複出現的行。 -u或--unique 僅顯示不重複出現行列。 [輸入檔案] 指定已排序好的文字檔案。如果不指定此項,則從標準讀取資料; [輸出檔案] 指定輸出的檔案。如果不指定此選項,則將內容顯示到標準輸出裝置(顯示終端)。
cut
作用:將行按指定的分隔符分割成多列。它的弱點在於不好處理多個分隔符重複的情況,因此經常結合tr的去重功能。 cut命令主要是接受三個定位方法:第一,位元組(bytes),用選項-b 第二,字元(characters),用選項-c 第三,域(fields),用選項-f 注意:英文和阿拉伯數字是單位元組字元,中文是雙位元組字元,甚至是3位元組字元(根據編碼而定)。 注意:按位元組或字元分割時將不能指定-d,因為-d是劃分欄位的。格式:#cut OPTION... [FILE]...
[option] -b:按位元組篩選; -n:與"-b"選項連用,表示禁止將位元組分割開來操作(一般情況下不用,防止-b將多位元組的字元強行分割導致亂碼); -c:按字元篩選; -d:指定欄位分隔符,不寫-d時的預設欄位分隔符為"TAB";因此只能和"-f"選項一起使用。 -f:與-d一起使用,以指定的分隔符為單位,選擇顯示的列號。 --complement:顯示出去-f指定的列的其他列(即顯示-f的補集)。 --output-delimiter:指定輸出分割符;預設為輸入分隔符。 注意:cut分隔符必須是單個字元。
tr
tr命令:它可以用一個字元來替換另一個字元,或者可以完全除去一些字元。您也可以用它來除去重複字元。 tr用來從標準輸入中通過替換或刪除操作進行字元轉換。tr主要用於刪除檔案中控制字元或進行字元轉換。使用tr時要使用兩個字串:字串1用於查詢,字串2用於處理各種轉換。tr剛執行時,字串1中的字元被對映到字串2中的字元,然後轉換操作開始。 格式:#tr [OPTION]... SET1 [SET2][option] -c: 反選設定字元。也就是符合 SET1 的部份不做處理,不符合的剩餘部份才進行轉換。要求字符集為ASCII。 -s :刪除所有重複出現字元序列,只保留第一個;即將重複出現字串壓縮為一個字串。 -d :刪除字串1中所有輸入字元。
SET字符集
指定字串1或字串2的內容時,只能使用單字元或字串範圍或列表。 CHAR1-CHAR2 :字元範圍從 CHAR1 到 CHAR2 的指定,範圍的指定以 ASCII 碼的次序為基礎,只能由小到大,不能由大到小。 [a-z] a-z內的字元組成的字串。 [A-Z] A-Z內的字元組成的字串。 [0-9] 數字串。 [:alnum:] :所有字母字元與數字 [:alpha:] :所有字母字元 [:lower:] :所有小寫字母 [:upper:] :所有大寫字母 [:digit:] :所有數字 [:xdigit:] :所有 16 進位制的數字 [:blank:] :所有水平空格 [:cntrl:] :所有控制字元 [:graph:] :所有可列印的字元(不包含空格符) [:print:] :所有可列印的字元(包含空格符) [:punct:] :所有標點字元 [:space:] :所有水平與垂直空格符
練習
1.將test.sh中的is替換為IS,並追加到a.txt檔案中。 # cat test.sh|tr "is" "IS" >a.txt 2.將test中的小寫字母轉換為大寫字母,並追加到a.txt檔案中。 # cat test.sh|tr [a-z] [A-Z] >a.txt 注意:不能追加到原檔案中,否則原檔案會被清空。