1. 程式人生 > >Linux下grep、tail、wc、awk檔案處理命令

Linux下grep、tail、wc、awk檔案處理命令

閱讀目錄

grep

Linux系統中grep命令是一種強大的文字搜尋工具,它能使用正則表示式搜尋文字,並匹配行打印出來。

命令語法:

usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
[-e pattern] [-f file] [--binary-files=value] [--color=when]
[--context[=num]] [--directories=action] [--label] [--line-buffered]
[--null] [pattern] [file ...]

命令例項:

-c:計算匹配到的行數,並顯示結果;

➜  ~ ping www.cnblogs.com > blog.log | tail -f blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.616 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=26.738 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.482 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=32 time=26.485 ms
64 bytes from 42.121.252.58: icmp_seq=4 ttl=32 time=26.325 ms
^C ➜ ~ grep -c 26.616 blog.log 1
複製程式碼

-C 2:顯示匹配行,並顯示之前與之後的兩行,也就是一共顯示5行;

➜  ~ grep -C 2 26.616 blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.616 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=26.738 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.482 ms

-A 2:顯示匹配行,並顯示之後的兩行;

➜  ~ grep -A 2 26.616 blog.log
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.616 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=26.738 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.482 ms

-v:顯示不包含匹配行的所有行;

➜  ~ grep -v 26.616 blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=26.738 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.482 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=32 time=26.485 ms
64 bytes from 42.121.252.58: icmp_seq=4 ttl=32 time=26.325 ms
複製程式碼

  -color:顯示匹配內容,並用不同顏色突出顯示;

➜  ~ grep --color 26.616 blog.log
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.616 ms

tail

   tail命令是線上機器檢視log最常用的命令,可以從指定點開始將檔案寫到標準輸出,tail -f 可以檢視不停打出的日誌檔案,使你看到最新的log日誌。

命令語法:

  usage: tail [-F | -f | -r] [-q] [-b # | -c # | -n #] [file ...]

命令例項:

  -f:監視File檔案增長;

➜  ~ ping www.cnblogs.com > blog.log | tail -f blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.250 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=25.807 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=25.966 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=32 time=25.939 ms
64 bytes from 42.121.252.58: icmp_seq=4 ttl=32 time=25.833 ms
64 bytes from 42.121.252.58: icmp_seq=5 ttl=32 time=25.862 ms
一直顯示下去。。。
複製程式碼

  -q:與-f相反,將檔案內容直接顯示出來,預設顯示檔案從後往前數10行的內容;

➜  ~ tail -q blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=26.250 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=25.807 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=25.966 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=32 time=25.939 ms
64 bytes from 42.121.252.58: icmp_seq=4 ttl=32 time=25.833 ms
64 bytes from 42.121.252.58: icmp_seq=5 ttl=32 time=25.862 ms
複製程式碼

  -n:從後往前數,顯示指定的行數,一般-f結合使用:-fn,比如-fn 20,一次當前顯示檔案的最後20行,並不停顯示檔案的最新內容;

➜  ~ ping www.cnblogs.com > blog.log | tail -fn 1 blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=25.813 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=26.363 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.218 ms
64 bytes from 42.121.252.58: icmp_seq=3 ttl=32 time=26.292 ms
一直顯示下去。。。
複製程式碼

  顯示檔案內容的同時,顯示行號(並不是檔案的行號,而是當前顯示的行號):

➜  ~ ping www.baidu.com > baidu.log | tail -fn 500 baidu.log | awk '{print NR,$0}' 【或者 ping www.baidu.com > baidu.log | tail -fn 500 baidu.log | cat -n】
1 PING www.a.shifen.com (61.135.169.125): 56 data bytes
2 64 bytes from 61.135.169.125: icmp_seq=0 ttl=51 time=6.030 ms
3 64 bytes from 61.135.169.125: icmp_seq=1 ttl=51 time=3.815 ms
4 64 bytes from 61.135.169.125: icmp_seq=2 ttl=51 time=3.964 ms
5 64 bytes from 61.135.169.125: icmp_seq=3 ttl=51 time=3.775 ms
複製程式碼

   從後往前數檔案2行直接顯示出來:

tail -n 2 baidu.log

  從檔案的第二行開始顯示檔案剩餘部分:

tail -n +2 baidu.log

wc

  Linux wc命令用於計算字數。利用wc指令我們可以計算檔案的Byte數、字數、或是列數,不制定檔名或者檔名為“-”,則wc會從標準輸入裝置讀取資料。

命令語法:

  usage: wc [-clmw] [file ...]

命令例項:

  -c 或--bytes或--chars顯示Bytes數:

~ cat blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=25.762 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=25.733 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.556 ms
➜  ~ wc -c blog.log
     238 blog.log
複製程式碼

  顯示行數:-l,顯示字數或單詞數:-w:

~ wc -l blog.log
       4 blog.log
➜  ~ wc -w blog.log
      30 blog.log

  不過以上都可以直接wc filename,輸出值的含義對應上面兩個例子:

➜  ~ wc blog.log
       4      30     238 blog.log

awk

  awk是一種處理文字檔案的語言,是一個強大的文字分析工具。

命令語法:

awk [選項引數] 'script' var=value file(s)

awk [選項引數] -f scriptfile var=value file(s)

命令例項:

  直接看栗子,就不解釋了:

~ cat blog.log
PING www.cnblogs.com (42.121.252.58): 56 data bytes
64 bytes from 42.121.252.58: icmp_seq=0 ttl=32 time=25.762 ms
64 bytes from 42.121.252.58: icmp_seq=1 ttl=32 time=25.733 ms
64 bytes from 42.121.252.58: icmp_seq=2 ttl=32 time=26.556 ms
➜  ~ awk '{print $1 $2}' blog.log
PINGwww.cnblogs.com
64bytes
64bytes
64bytes
複製程式碼
➜  ~ awk '{print $1 " ->> "$2}' blog.log
PING ->> www.cnblogs.com
64 ->> bytes
64 ->> bytes
64 ->> bytes

awk的詳情看這裡