grep、sed、awk、head、tail、gsub、sub

lusklusklusk發表於2016-09-22
Awk、sed與grep,俗稱Linux下的三劍客,它們之前有很多相似點,但是同樣也各有各的特色,相似的地方是它們都可以匹配文字,其中sed和awk還可以用於文字編輯,而grep則不具備這個功用。

grep搜尋
sed 修改和編輯文字檔案中某些行
awk 是訪問文字檔案,操縱文字檔案中某些資料


三者都不能後面直接接檔名
grep 檔名
sed 檔名
awk檔名

只有如下才行,才會顯示內容
grep 關鍵字  檔名
sed -n '行數p' 檔名
awk '{print}' 檔名



grep -n表示把結果展示出來後,給每一行加上行號
grep -A表示Print  NUM  lines of trailing context after matching lines顯示匹配內容和它的後幾行
grep -B表示Print  NUM  lines of leading context before matching lines顯示匹配內容和它的前幾行



sed -n表示指定的行才會被列出來。在一般 sed 的用法中,所有來自檔案的內容都會被列出到螢幕上。
sed -n '1p' 檔名           #顯示第一行 
sed -n '$p' 檔名           #顯示最後一行
sed -n '1,2p' 檔名        #顯示第一行到第二行
sed -n '2,$p' 檔名        #顯示第二行到最後一行



awk -F表示以什麼分隔每行的內容
awk -F ","   #表示,逗號分隔
awk -F ";"   #表示;分號分隔


awk和{print}在一起表示顯示哪些列,或統計多少列,必須加{},大括號裡面的最後可以有;也可以沒有,沒有什麼影響
awk -F "," '{print $0}'   #表示,逗號分隔後,顯示所有列$0  is the whole record
awk -F "," '{print $1}'   #表示,逗號分隔後,顯示第1列
awk -F "," '{print $3}'   #表示,逗號分隔後,顯示第3列
awk -F "," '{print NF}'   #表示,逗號分隔後,這一行總共有多少列




以下兩者沒有區別,顯示所有內容
awk '{print}' 檔名
awk '{print;}' 檔名



head、tail後面可以直接接檔名,表示顯示全部內容
head 檔名     #顯示檔案所有內容
head -1 檔名  #顯示檔案第1行內容
head -2 檔名  #顯示檔案最前面2行內容(不是隻顯示第2行)


tail 檔名     #顯示檔案所有內容
tial -1 檔名  #顯示檔案最後1行內容
tial -2 檔名  #顯示檔案最後2行內容(不是隻顯示倒數第2行)









awk經常和gsub、sub一起使用,作用就是使用它們替換檔案中的內容
sub表示把行裡某列的內容只替換第一個
gsbu表示把行裡某列的內容都替換掉


一般格式為
awk  'sub(/A/,"B")'  #表示檔案不分列,所有行中的第一個A全部替換為B
awk -F "分隔符"  'sub(/A/,"B",$N)'  #表示檔案分列,第N列中的第一個A替換為B

awk  'gsub(/A/,"B")'  #表示檔案不分列,所有行中A的全部替換為B
awk -F "分隔符"  'gsub(/A/,"B",$N)'  #表示檔案分列,第N列中A的全部替換為B


實驗如下
[oradbm@plmdba script]$ cat 12
a-1, b, c, 2011-11-22, a:d
b-1, b, c, 2011-11-22, a:d
c-1, b, c, 2011-11-22, a:d
d-1, b, c, 2011-11-22, a:d


gsub發現每一行中的所有-都替換掉了(不分列的情況)
[oradbm@plmdba script]$ cat 12 | awk  'gsub(/-/,"")'
a1, b, c, 20111122, a:d
b1, b, c, 20111122, a:d
c1, b, c, 20111122, a:d
d1, b, c, 20111122, a:d


sub發現每一行中只有第一次出現的-被替換掉了(不分列的情況)
[oradbm@plmdba script]$ cat 12 | awk  'sub(/-/,"")'
a1, b, c, 2011-11-22, a:d
b1, b, c, 2011-11-22, a:d
c1, b, c, 2011-11-22, a:d
d1, b, c, 2011-11-22, a:d


gsub發現第4列所有-都替換掉了(分列的情況)
[oradbm@plmdba script]$ cat 12 | awk -F "," 'gsub(/-/,"",$4)'
a-1  b  c  20111122  a:d
b-1  b  c  20111122  a:d
c-1  b  c  20111122  a:d
d-1  b  c  20111122  a:d


sub發現第4列只有第一次出現的-被替換掉了(分列的情況)
[oradbm@plmdba script]$ cat 12 | awk -F "," 'sub(/-/,"",$4)'
a-1  b  c  201111-22  a:d
b-1  b  c  201111-22  a:d
c-1  b  c  201111-22  a:d
d-1  b  c  201111-22  a:d

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2125311/,如需轉載,請註明出處,否則將追究法律責任。

相關文章