1. 程式人生 > 其它 >Linux常用文字命令:grep、sed、awk 、cut、tr、wc、uniq、sort

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重定向來儲存結果。預設情況下,所有的輸出行都被列印到螢幕上。

2.sed編輯器逐行處理檔案(或輸入),並將結果傳送到螢幕。具體過程如下:
首先sed把當前正在處理的行儲存在一個臨時快取區中(也稱為模式空間),然後處理臨時緩衝區中的行,完成後把該行傳送到螢幕上。
sed每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入檔案的最後一行後,sed便結束執行。
sed把每一行都存在臨時緩衝區中,在緩衝區中對這個副本進行編輯,將處理後的行輸出到螢幕上,但不會修改原檔案,除非使用-i引數。

3.sed可以對檔案進行過濾,也可以進行修改。

4.sed是一種語言,awk是一種語言,bash也是一種語言。 5.sed是對文字一行一行進行處理的,若不加地址定界,或地址定界匹配不帶,則預設會一行一行的匹配處理文字內容,直到結束。 sed用法:
#sed [option] 'script' inputfile....
[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

注意:不能追加到原檔案中,否則原檔案會被清空。