天天看點

Linux下grep、sed、awk、tcpdump、strace用法執行個體

1. grep

grep 是全面搜尋正規表達式并把行列印出來)是一種強大的文本搜尋工具,它能使用正規表達式搜尋文本,并把比對的行列印出來。

用法:

grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
           

首先使用ls指令和輸出重定向生成兩個用來測試grep指令的文本

root@CGS--:/home/lhp# ls /usr/ > ls_usr.txt
root@CGS--:/home/lhp# ls /etc/ > ls_etc.txt
           

1). 在ls_usr.txt中搜尋含有“bin”的字元串

root@CGS--:/home/lhp# grep bin ls_usr.txt
bin
sbin
           

2). 從多檔案中搜尋含有”bin”的字元串

root@CGS--:/home/lhp# grep bin *
ls_etc.txt:bindresvport.blacklist
ls_usr.txt:bin
ls_usr.txt:sbin
           
root@CGS--:/home/lhp# grep bin ls*
ls_etc.txt:bindresvport.blacklist
ls_usr.txt:bin
ls_usr.txt:sbin
           

3). 從ls_usr.txt中搜尋含“bin”和”BIN”的字元串。

root@CGS--:/home/lhp# echo /BINs >> ls_usr.txt
root@CGS--:/home/lhp# echo /BINABLE >> ls_usr.txt
root@CGS--:/home/lhp# echo /Bining >> ls_usr.txt
root@CGS--:/home/lhp# grep -i bin ls_usr.txt
bin
sbin
/BINs
/BINABLE
/Bining
           

4). 在ls_usr.txt中搜尋以this開頭case結尾的字元串

root@CGS--:/home/lhp# echo "this is test case" >> ls_usr.txt
root@CGS--:/home/lhp# grep -i "this.*case" ls_usr.txt
this is test case
           

5). 在ls_usr.txt中搜尋整詞is,不像1)中那種含部分,并加上不區分大小寫

root@CGS--:/home/lhp# grep -iw "is" ls_usr.txt
this is test case
           

6). 顯示ls_etc.txt中含emacs比對行前、後、前後 4行

root@CGS--:/home/lhp# grep -A 4 -w emacs ls_etc.txt
emacs
environment
firefox
fonts
foomatic
root@CGS--:/home/lhp# grep -B 4 -w emacs ls_etc.txt
dictionaries-common
doc-base
dpkg
drirc
emacs
root@CGS--:/home/lhp# grep -C 4 -w emacs ls_etc.txt
dictionaries-common
doc-base
dpkg
drirc
emacs
environment
firefox
fonts
foomatic
           

7). 遞歸搜尋/home/lhp檔案目錄下檔案中含有bin的字元串

[email protected]:/home# grep -r bin /home/lhp/*
/home/lhp/ls_etc.txt:bindresvport.blacklist
/home/lhp/ls_usr.txt:bin
/home/lhp/ls_usr.txt:sbin
           

8). 遞歸搜尋/home/lhp檔案目錄下檔案中含有bin的字元串,統計個數

root@CGS--:/home# grep -rc bin /home/lhp/*
/home/lhp/ls_etc.txt:
/home/lhp/ls_usr.txt:
           

9). 顯示ls_usr.txt中不含bin、local的行

root@CGS--:/home/lhp# grep -v -e bin -e local ls_usr.txt
games
include
lib
share
src
/BINs
/BINABLE
/Bining
this is test case
           

10). 遞歸搜尋/home/lhp檔案目錄下檔案中含有emacs的字元串,并顯示檔案名

root@CGS--:/home/lhp# grep -rl emacs /home/lhp/*
/home/lhp/ls_etc.txt
           

11). 遞歸搜尋/home/lhp檔案目錄下與bin比對字元串,并顯示行号

root@CGS--:/home/lhp# grep -rn emacs /home/lhp/*
/home/lhp/ls_etc.txt::emacs
           

2. sed

sed是一個很好的檔案處理工具,本身是一個管道指令,主要是以行為機關進行處理,可以将資料行進行替換、删除、新增、選取等特定工作。

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
如:sed [-nefri] ‘command’ 輸入文本
           

常用選項:

-n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 參數後,則隻有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e∶直接在指令列模式上進行 sed 的動作編輯;
-f∶直接将 sed 的動作寫在一個檔案内, -f filename 則可以執行 filename 内的sed 動作;
-r∶sed 的動作支援的是延伸型正規表示法的文法。(預設是基礎正規表示法文法)
-i∶直接修改讀取的檔案内容,而不是由螢幕輸出。
           

常用指令:

a∶新增,a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)
c∶取代,c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d ∶删除
i∶插入,i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p∶列印,亦即将某個選擇的内容輸出。通常 p 會與參數 sed -n 一起運作~
s∶取代,通常這個 s 的動作可以搭配正規表示法!例,s/old/new/g
           

1). 删除ls_usr.txt的第一行

[email protected]:/home/lhp# sed '1d' ls_usr.txt

2). 删除ls_usr.txt的最後一行

[email protected]:/home/lhp# sed '$d' ls_usr.txt

3). 删除ls_usr.txt的第3到第4行

[email protected]:/home/lhp# sed '3,4d' ls_usr.txt

4). 顯示ls_usr.txt的第一行

[email protected]:/home/lhp# sed -n '1p' ls_usr.txt

5). 顯示ls_usr.txt的最後一行

[email protected]:/home/lhp# sed -n '$p' ls_usr.txt

6). 顯示ls_usr.txt從開頭到結尾

[email protected]:/home/lhp# sed -n '1,$p' ls_usr.txt

7). 在ls_usr.txt中查找含bin的行,并輸出到螢幕上

[email protected]:/home/lhp# sed -n '/bin/p' ls_usr.txt

8). 在ls_usr.txt第一行後添加字元串

[email protected]:/home/lhp# sed '1a append after line 1' ls_usr.txt

9). 将ls_usr.txt中的最後一行替換

[email protected]:/home/lhp# sed '$c replace last line' ls_usr.txt

10). 先查找last,并将其替換為空

[email protected]:/home/lhp# sed -n '/last/p' ls_usr.txt | sed 's/last//g'

11). 在最後一行插入

[email protected]:/home/lhp# sed -i '$a over' ls_usr.txt

3. awk

awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對資料分析并生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符将每行切片,切開的部分再進行各種分析處理。

使用方法:

awk '{pattern + action}' {filenames}

其中 pattern 表示 AWK 在資料中查找的内容,而 action 是在找到比對内容時所執行的一系列指令。花括号({})不需要在程式中始終出現,但它們用于根據特定的模式對一系列指令進行分組。 pattern就是要表示的正規表達式,用斜杠括起來。

awk語言的最基本功能是在檔案或者字元串中基于指定規則浏覽和抽取資訊,awk抽取資訊後,才能進行其他文本操作。完整的awk腳本通常用來格式化文本檔案中的資訊。

通常,awk是以檔案的一行為處理機關的。awk每接收檔案的一行,然後執行相應的指令,來處理文本。

使用方式:

指令行方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk指令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。
在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,預設的域分隔符是空格。

shell腳本方式
将所有的awk指令插入一個檔案,并使awk程式可執行,然後awk指令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。
相當于shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk

将所有的awk指令插入一個單獨檔案,然後調用:
awk -f awk-script-file input-file(s)
其中,-f選項加載awk-script-file中的awk腳本,input-file(s)是待處理的檔案。
           

1). 使用last指令隻顯示前5個使用者資訊的第一個域

[email protected]:~# last -n 5 | awk '{print $1}'

awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然後将記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。預設域分隔符是"空白鍵" 或 "[tab]鍵"

2). 隻是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割

[email protected]:~# cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'

3). 顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗号分割,而且在所有行添加列名name,shell,在最後一行添加”end, end”

[email protected]:~# cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "end,end"}'

先執行BEGING,然後讀取檔案,讀入有/n換行符分割的一條記錄,然後将記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,随後開始執行模式所對應的動作action。接着開始讀入第二條記錄...直到所有的記錄都讀完,最後執行END操作

4). 在/etc/passwd中搜尋有root關鍵字的所有行

[email protected]:~# awk -F: '/root/' /etc/passwd root:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,比對了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的内容)。

搜尋支援正則,例如找root開頭的: awk -F: ‘/^root/’ /etc/passwd

5). 搜尋/etc/passwd有root關鍵字的所有行,并顯示對應的第1個域

[email protected]:~# awk -F: '/root/{print $1}' /etc/passwd

awk内置變量

ARGC               指令行參數個數
ARGV               指令行參數排列
ENVIRON            支援隊列中系統環境變量的使用
FILENAME           awk浏覽的檔案名
FNR                浏覽檔案的記錄數
FS                 設定輸入域分隔符,等價于指令行 -F選項
NF                 浏覽記錄的域的個數
NR                 已讀的記錄數
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符
           

6). 統計/etc/passwd:檔案名,每行的行号,每行的列數,對應的完整行内容

[email protected]:~# awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

或可以用printf 代替 print

[email protected]:~# awk -F: '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

awk程式設計

7). 統計/etc/passwd的賬戶人數

[email protected]:~# awk 'BEGIN {count=0;print "start counting ..."} {count=count+1;print $0;} END{printf("total user num : %d\n", count)}' /etc/passwd

8). 統計某個檔案夾下的檔案占用的位元組數

[email protected]:/home/lhp# ls -r -l |awk 'BEGIN {size=0;} {size=size+$5;} END{printf("total file size is %d\n", size)}'

9). 統計某個檔案夾下的檔案占用的位元組數,過濾4096大小的檔案(一般都是檔案夾),并以M為機關

[email protected]:/home/lhp# ls -l |awk 'BEGIN {size=0;printf("start counting...")} {if($5!=4096){size=size+$5;}} END{printf("the total size of files is %fM\n", size/1024/1024)}'

總結,awk文法上很多地方是借鑒于C,是以在輸出、循環、數組上很類似。

但要注意數組,因為awk中數組的下标可以是數字和字母,數組的下标通常被稱為關鍵字(key)。值和關鍵字都存儲在内部的一張針對key/value應用hash的表格裡。由于hash不是順序存儲,是以在顯示數組内容時會發現,它們并不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動建立的,awk也同樣會自動判斷其存儲的是數字還是字元串。一般而言,awk中的數組用來從記錄中收集資訊,可以用于計算總和、統計單詞以及跟蹤模闆被比對的次數等等

10). 通過awk腳本運作(注意左大括号的位置,不錯會報錯),我在測試中把腳本命名為awk_script_demo

BEGIN {
        count=;
}
{
        name[count] = $;
        count ++;
};
END {
for(i=;i < NR; i++)
        printf("%d %s\n", i, name[i])
}
           

運作:

結果:

Linux下grep、sed、awk、tcpdump、strace用法執行個體

11) 上面還提到使用shell的方式運作awk,這是就不再贅述了

4. tcpdump

tcpdump就是:dump the traffic on a network,根據使用者的定義對網絡上的資料包進行截獲的包分析工具。 tcpdump可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網絡層、協定、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

指令格式:

Linux下grep、sed、awk、tcpdump、strace用法執行個體

常用參數描述:

-A  以ASCII碼方式顯示每一個資料包(不會顯示資料包中鍊路層頭部資訊). 在抓取包含網頁資料的資料包時, 可友善檢視資料.

-c  count   tcpdump将在接受到count個資料包後退出.

-C  file-size (此選項用于配合-w file 選項使用)
    該選項使得tcpdump 在把原始資料包直接儲存到檔案中之前, 檢查此檔案大小是否超過file-size. 如果超過了, 将關閉此檔案,另創一個檔案繼續用于原始資料包的記錄. 新建立的檔案名與-w 選項指定的檔案名一緻, 但檔案名後多了一個數字.該數字會從1開始随着新建立檔案的增多而增加. file-size的機關是百萬位元組(這裡指1,000,000個位元組,并非1,048,576個位元組, 後者是以1024位元組為1k, 1024k位元組為1M計算所得, 即1M=1024 * 1024 = 1,048,576)

-d  以容易閱讀的形式,在标準輸出上列印出編排過的包比對碼, 随後tcpdump停止.

-D  列印系統中所有tcpdump可以在其上進行抓包的網絡接口. 每一個接口會列印出數字編号, 相應的接口名字, 以及可能的一個網絡接口描述. 其中網絡接口名字和數字編号可以用在tcpdump 的-i flag 選項, 來指定要在其上抓包的網絡接口.

-e  每行的列印輸出中将包括資料包的資料鍊路層頭部資訊

-f  顯示外部的IPv4 位址時, 采用數字方式而不是名字

-F  file  使用file 檔案作為過濾條件表達式的輸入, 此時指令行上的輸入将被忽略.

-i  interface  指定tcpdump 需要監聽的接口.  如果沒有指定, tcpdump 會從系統接口清單中搜尋編号最小的已配置好的接口
           

1) 預設啟動,該情況下将監視第一個網絡接口上所有流過的資料包

[email protected]:/home/lhp# tcpdump

2) 使用-i參數,指定網絡接口

[email protected]:/home/lhp# tcpdump -i eth0

3) 使用host指定主機(用主機名或者ip)

[email protected]:/home/lhp# tcpdump -i eth0 host localhost

[email protected]:/home/lhp# tcpdump -i eth0 host 127.0.0.1

4) 将在本機上執行tcpdump -i eth0截獲的内容重定向到dump.txt中

Linux下grep、sed、awk、tcpdump、strace用法執行個體

從上圖中可以看出我目前是通過ssh的方式遠端到我使用的Linux主機的,并可以得知ssh是基于TCP的。

5) 是以可以嘗試監視指定主機和端口的資料包,這裡隻截取20條資料

[email protected]:/home/lhp# tcpdump tcp port 6141 and host 116.216.28.61 -c 20

Linux下grep、sed、awk、tcpdump、strace用法執行個體

6) 監聽指定主機和目标主機之前的通信,這裡截獲的本機和網關之間的資料

[email protected]:/home/lhp# tcpdump host 172.18.0.10 and 172.18.21.14

Linux下grep、sed、awk、tcpdump、strace用法執行個體

7) 除了可以像6)中使用and,還可以使用or、not,比如:

[email protected]:/home/lhp# tcpdump host 172.18.21.14 and not 172.18.0.10 -c 30

Linux下grep、sed、awk、tcpdump、strace用法執行個體

[email protected]:/home/lhp# tcpdump host 172.18.21.14 and \(172.18.0.10 or 172.18.255.255\) -c 30

8) 截獲指定主機發送的所有資料

[email protected]:/home/lhp# tcpdump -i eth0 src host 172.18.21.14

Linux下grep、sed、awk、tcpdump、strace用法執行個體

9) 截獲指定主機收到的所有資料

[email protected]:/home/lhp# tcpdump -i eth0 dst host 172.18.21.14

Linux下grep、sed、awk、tcpdump、strace用法執行個體

10) 監聽本地主機與本場網絡上的主機之間的所有通信資料包

[email protected]:/home/lhp# tcpdump net 172.18.0.0/16

Linux下grep、sed、awk、tcpdump、strace用法執行個體

11) 列印所有源位址或目标位址是本地主機的IP資料包,如果本地網絡通過網關連到了另一網絡, 則另一網絡并不能算作本地網絡

[email protected]:/home/lhp# tcpdump 172.18.21.14 and not net 172.18.0.0/16

12)tcpdump抓包複雜執行個體

[email protected]:/home/lhp# tcpdump tcp -i eth0 -t -s 0 -c 100 and dst port ! 22 and src net 172.18.0.0/16 -w /home/lhp/log1.txt

參數說明如下:

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾資料報的類型 (2)-i eth1 : 隻抓經過接口eth1的包 (3)-t : 不顯示時間戳 (4)-s 0 : 抓取資料包時預設抓取長度為68位元組。加上-S 0 後可以抓到完整的資料包 (5)-c 100 : 隻抓取100個資料包 (6)dst port ! 22 : 不抓取目标端口是22的資料包 (7)src net 192.168.1.0/24 : 資料包的源網絡位址為192.168.1.0/24 (8)-w ./target.cap : 儲存成cap檔案,友善用ethereal(即wireshark)分析

13) 使用tcpdump抓取HTTP包

[email protected]:/home/lhp# tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

其中0x4745 為”GET”前兩個字母”GE”,0x4854 為”HTTP”前兩個字母”HT”

tcpdump 對截獲的資料并沒有進行徹底解碼,資料包内的大部分内容是使用十六進制的形式直接列印輸出的。顯然這不利于分析網絡故障,通常的解決辦法是先使用帶-w參數的tcpdump 截獲資料并儲存到檔案中,然後再使用其他程式(如Wireshark)進行解碼分析

5. strace

strace常用來跟蹤程序執行時的系統調用和所接收的信号。 在Linux世界,程序不能直接通路硬體裝置,當程序需要通路硬體裝置(比如讀取磁盤檔案,接收網絡資料等等)時,必須由使用者态模式切換至核心态模式,通過系統調用通路硬體裝置。strace可以跟蹤到一個程序産生的系統調用,包括參數,傳回值,執行消耗的時間.

常用參數說明:

-p  跟蹤指定的程序
-f  跟蹤由fork子程序系統調用
-F  嘗試跟蹤vfork子程序系統調吸入,與-f同時出現時, vfork不被跟蹤
-o filename 預設strace将結果輸出到stdout。通過-o可以将輸出寫入到filename檔案中
-ff 常與-o選項一起使用,不同程序(子程序)産生的系統調用輸出到filename.PID檔案
-r  列印每一個系統調用的相對時間
-t  在輸出中的每一行前加上時間資訊。 -tt 時間确定到微秒級。還可以使用-ttt列印相對時間
-v  輸出所有系統調用。預設情況下,一些頻繁調用的系統調用不會輸出
-s  指定每一行輸出字元串的長度,預設是。檔案名一直全部輸出
-c  統計每種系統調用所執行的時間,調用次數,出錯次數。
-e  expr    輸出過濾器,通過表達式,可以過濾出掉你不想要輸出
           

使用執行個體(跟蹤ps運作):

結果:

Linux下grep、sed、awk、tcpdump、strace用法執行個體

附:删除已輸入的指令

ctrl + w —往回删除一個單詞,光标放在最末尾

ctrl + k —往前删除到末尾,光标放在最前面(可以使用ctrl+a)

ctl + u 删除光标以前的字元

ctl + k 删除光标以後的字元

ctl + a 移動光标至的字元頭

ctl + e 移動光标至的字元尾

ctl + l 清屏

參考資料

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856896.html

http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

繼續閱讀