日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gawk用法

發布時間:2023/12/20 编程问答 89 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gawk用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

一、awk概述

二、gawk工作機制

三、gawk命令介紹

?

?

一、awk概述

?

AWK的名字來自于其創始人Aho, Weinberger, Kernihan三人的名字首字母的組合。

?

awk是一個功能非常強大的文本處理工具,它能把文本當做數據庫,然后把數據庫中的每一行切分為多個字段,可以實現分別對多個字段或行進行處理,并使之按照一定的格式輸出,所以awk是文本報告生成器,它能格式化文本。而要選擇性地處理字段或行,則可以使用模式(PATTERN)來匹配。

?

此外,awk已經是一門獨立完整的編程語言,它支持一般編程語言所具備的特性,如支持變量、數組等數據結構、支持條件判斷及循環等功能、具有內置函數等。而正如前面所說,awk的主要是作為文本報告生成器來使用的。

?

gawk是GNU project的awk解釋器的開放源代碼實現,而nawk (new awk)則是20世紀80年代發展起來的新版本,不管是gawk還是nawk都是在其舊版本oawk (old awk)完善一些功能特性而來的。因為大家更傾向于使用awk及gawk,因此本文介紹的是gawk。

?

二、gawk工作機制

?

awk的工作流程首先是先讀取文本文件中的一行,并對這一行切分為多個字段,將每個字段都存放至awk的內置變量($1,$2,$3,...)中,而當前處理的一行則存放在awk內置變量$0中。接著awk根據用戶指定的模式(PATTERN),分別對行或每一行中的字段進行匹配,并根據用戶指定的動作語句(Action)對匹配到的行或字段進行加工處理;最后awk會將加工處理的結果默認輸出至標準輸出,并開始讀取文本文件的下一行進行處理,以此類推。

?

awk就是這樣來實現強大的文本處理功能的。不難想到,用戶可以通過模式匹配(PATTERN)選擇要處理的行或字段,而在動作語句(Action)中指明要如何加工處理數據、數據以什么格式輸出等,如果有需要還可以利用Action中的條件判斷語句作進一步選擇要處理和輸出的數據,也可以通過循環語句實現對每一行字段間的遍歷或數組的各個元素的遍歷等。需要注意的是,awk具有內生循環,因此會自動遍歷文本文件中的每一行。

?

三、gawk命令介紹

?

命令簡述:

gawk - pattern scanning and processing language

gawk是文本處理工具,支持模式掃描,是一門編程語言。

????

語法格式:

gawk [options] 'program' FILE ...

?

常用選項:

-F:用于指定輸入時用到的字段分隔符;

-v var=value:自定義變量;

?

program:

program:PATTERN{ACTION STATEMENTS}

①PATTERN:模式

②ACTION STATEMENTS:動作語句

?

PATTERN:

(1) empty:空模式,匹配每一行;

(2) /regular expression/:僅處理被此處的模式(正則表達式)所匹配到的行;

(3) relational expression:關系表達式;結果有“真”有“假”,結果為“真”時才執行;

(4) lines ranges:指定行范圍;

(5) BEGIN/END模式

①BEGIN{}:僅在開始處理文件中的文本之前執行一次;

②END{}:僅在文本處理完成之后、命令結束之前執行一次;

?

?

我們從netstat命令中提取了如下信息作為使用示例:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># cat netstat.txt </span> Proto Recv-Q Send-Q Local-Address Foreign-Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 10.10.10.140:49808 10.10.10.140:80 TIME_WAIT tcp 0 52 10.10.10.140:22 10.10.10.1:52641 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:51926 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:52640 ESTABLISHED tcp 0 0 10.10.10.140:49806 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49804 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49810 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49812 10.10.10.140:80 TIME_WAIT</code></span></span></span>

?

要點:

1.?$1,$2,...$n分別表示當前處理的一行的第1個、第2個...第n個字段。

2. 使用print語句時,在命令行可用逗號分隔各個字段,在輸出時默認以空白字符作為分隔符。

?

(1) empty:空模式,匹配每一行

示例:

顯示第1列、第4列:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print $1,$4}' netstat.txt </span> Proto Local-Address tcp 0.0.0.0:22 tcp 127.0.0.1:25 tcp 10.10.10.140:49808 tcp 10.10.10.140:22 tcp 10.10.10.140:22 tcp 10.10.10.140:22 tcp 10.10.10.140:49806 tcp 10.10.10.140:49804 tcp 10.10.10.140:49810 tcp 10.10.10.140:49812</code></span></span></span>

因為是空模式,所以會匹配每一行。

?

?

(2) /regular expression/:僅處理被此處的模式(正則表達式)所匹配到的行;

示例:

顯示netstat.txt文件中以tcp開頭的行:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^tcp\>/' netstat.txt </span> tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 10.10.10.140:49808 10.10.10.140:80 TIME_WAIT tcp 0 52 10.10.10.140:22 10.10.10.1:52641 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:51926 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:52640 ESTABLISHED tcp 0 0 10.10.10.140:49806 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49804 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49810 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49812 10.10.10.140:80 TIME_WAIT</code></span></span></span>

?

顯示/etc/fstab文件中以'UUID'開頭的行的第一個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^UUID/{print $1}' /etc/fstab </span> UUID<span style="color:#9a6e3a">=</span>60eb0d1c-9834-4348-9a79-2f91983a8ede UUID<span style="color:#9a6e3a">=</span>3995456f-a3e9-4b69-a0de-0fd48068da39 UUID<span style="color:#9a6e3a">=</span>01d24b59-eee4-472e-9985-ef44fd5e059c <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

?

顯示/etc/fstab文件中以'UUID'開頭的行的第一個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '!/^UUID/{print $1}' /etc/fstab </span><span style="color:slategray">#</span> <span style="color:slategray">#</span> <span style="color:slategray">#</span> <span style="color:slategray">#</span> <span style="color:slategray">#</span> <span style="color:slategray">#</span> <span style="color:slategray">#</span> tmpfs devpts sysfs proc /dev/sr0 <span style="color:slategray">#/dev/md0</span> <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

注意:對過濾模式取反,只需在模式前加上'!'即可。

?

?

(3) relational expression:關系表達式;結果有“真”有“假”,結果為“真”時才執行

?

什么才是“真”?結果為非0值、非空字符串,即為真。

?

示例:

顯示/etc/passwd中最后一個字段為'/bin/bash'的用戶的用戶名、id及shell:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash">方式一: <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '$NF=="/bin/bash"{print $1,$3,$NF}' /etc/passwd</span> root 0 /bin/bash logstash 500 /bin/bash centos 501 /bin/bash方式二: <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '$NF~/\/bin\/bash$/{print $1,$3,$NF}' /etc/passwd</span> root 0 /bin/bash logstash 500 /bin/bash centos 501 /bin/bash</code></span></span></span>

?

(4) lines ranges:指定行范圍

格式:

startline,endline:/pat1/,/pat2/

?

注意:不支持直接給出數字的格式,只能使用模式進行匹配;

?

示例:

顯示/etc/passwd文件中第2行到第10行的第一個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd</span> bin daemon adm lp <span style="color:#dd4a68">sync</span> <span style="color:#dd4a68">shutdown</span> halt mail uucp <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

錯誤示例:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '2,10{print $1}' /etc/passwd</span></code></span></span></span>

注意這是錯誤寫法!因為不能直接給出行數!

?

(5) BEGIN/END模式:

①BEGIN{}:僅在開始處理文件中的文本之前執行一次;

②END{}:僅在文本處理完成之后、命令結束之前執行一次;

?

示例:

指定分隔符為':':

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{FS=":"}{print $1,$3,$6}' /etc/passwd</span> root 0 /root bin 1 /bin daemon 2 /sbin adm 3 /var/adm lp 4 /var/spool/lpd <span style="color:#dd4a68">sync</span> 5 /sbin <span style="color:#dd4a68">shutdown</span> 6 /sbin halt 7 /sbin mail 8 /var/spool/mail</code></span></span></span>

?

統計出當前主機的tcp連接狀態為"LISTEN"的連接數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan</span> Active Internet connections <span style="color:#999999">(</span>servers and established<span style="color:#999999">)</span> Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 52 10.10.10.140:22 10.10.10.1:51926 ESTABLISHED tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># </span> <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan | awk '$NF=="LISTEN"{i++}END{print i}' </span> 5 <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

?

說到內建變量,我們來看一看awk的內建變量吧:

?

FSinput field seperator,輸入時的字段分隔符,默認為空白字符
OFSoutput field seperator,輸出時的字段分隔符,默認為空白字符
RSinput record seperator,輸入時的換行符,默認為\n
ORSoutput record seperator,輸出時的換行符,默認為\n
NFnumber of field,每一行的字段數量
NRnumber of record,行數,顯示為當前處理的行的行號
FNRfile number of record,行數,各個文件分開進行計數
FILENAME當前文件名
ARGC命令行給定的參數個數
ARGV數組,保存的是命令行給定的各參數

?

示例:

顯示/etc/passwd文件中每一行的第一個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -v FS=":" '{print $1}' /etc/passwd</span> root bin daemon adm lp <span style="color:#dd4a68">sync</span> <span style="color:#dd4a68">shutdown</span> halt</code></span></span></span>

顯示效果與直接用-F選項指出分隔符為':'相同。

?

顯示/etc/passwd文件中每一行的第1、3、7個字段,并且每個字段之間用冒號連接:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -v FS=":" -v OFS=":" '{print $1,$3,$7}' /etc/passwd</span> root:0:/bin/bash bin:1:/sbin/nologin daemon:2:/sbin/nologin adm:3:/sbin/nologin lp:4:/sbin/nologin sync:5:/bin/sync shutdown:6:/sbin/shutdown halt:7:/sbin/halt</code></span></span></span>

?

顯示/etc/fstab文件中每一行的字段數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print NF}' /etc/fstab </span> 0 1 2 10 1 9 12 1 6 6 6 6</code></span></span></span>

?

顯示netstat.txt文件中每一行的最后一個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print $NF}' netstat.txt </span> State LISTEN LISTEN TIME_WAIT ESTABLISHED ESTABLISHED ESTABLISHED TIME_WAIT TIME_WAIT TIME_WAIT TIME_WAIT</code></span></span></span>

這里需要注意NF和$NF的區別!我們說過,在awk中引用變量不需要帶上"$",即便是$1,$2,...也只是awk引用每一行中各個字段的專用符號,這里NF表示當前處理的行的字段數量,$NF則是將NF(即字段數量)的值作為"$#"中的數字"#",從而相當于使用awk的專用符號!

?

?

顯示netstat.txt文件中每一行的行號:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print NR}' netstat.txt </span> 1 2 3 4 5 6 7 8 9 10 11</code></span></span></span>

?

如果對一個文件的每一行進行顯示的話,則會顯示每一行的行號;而在整個文件處理結束之后再進行顯示時,則顯示的是文件的行號,如下:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'END{print NR}' netstat.txt </span> 11</code></span></span></span>

?

顯示文件/etc/fstab和/etc/inittab的行數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print NR}' /etc/fstab /etc/inittab </span> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29</code></span></span></span>

可以發現,這里將兩個文本文件當做一個文件來處理了,而如果需要將兩個或多個文件分開進行計數時,則可使用內建變量NFR:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print FNR}' /etc/fstab /etc/inittab </span> 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17</code></span></span></span>

?

顯示命令行給定的參數個數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{print ARGC}' /etc/fstab /etc/inittab </span> 3</code></span></span></span>

?

在命令行中給定的各個參數會存放在awk的內建數組ARGV中,可使用ARGV[#]引用各個參數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{print ARGV[0]}' /etc/fstab /etc/inittab </span> <span style="color:#dd4a68">awk</span> <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{print ARGV[1]}' /etc/fstab /etc/inittab </span> /etc/fstab <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{print ARGV[2]}' /etc/fstab /etc/inittab </span> /etc/inittab</code></span></span></span>

注意:這里第一個參數是awk,而不是'program'!

?

?

除了內建變量之外,awk還支持用戶自定義變量,而自定義變量有兩種方式:

(1) 通過選項-v var=value定義變量;

(2) 在program中直接定義;

?

命令演示:

也可通過選項直接定義:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -v test='hello awk' '{print test}' netstat.txt </span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span> hello <span style="color:#dd4a68">awk</span></code></span></span></span>

文件有多少行,就顯示多少個'hello awk';這里引用變量不需要'$',再次強調!

?

如果不需要對各行處理,而僅顯示一次,則:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -v test='hello awk' 'BEGIN{print test}' netstat.txt </span> hello <span style="color:#dd4a68">awk</span></code></span></span></span>

?

在program中定義:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{test="hello"; print test}'</span> hello</code></span></span></span>

?

?

接下來介紹awk常用的Action:

?

(1) pirnt語句:

格式:

print item1, item2, ...

?

要點:

①在命令中以逗號作為分隔符,輸出時默認以空白字符作為分隔符;

②這里輸出的各item可以是字符串、數值、當前記錄的字段、變量、數組以及awk的表達式等;
③如果輸出的數值,則數值會隱射為字符串后輸出,而在計算時仍為數值;

④如果省略item,輸出效果相當于'print $0'.

?

示例:

顯示/etc/fstab文件中最后4行中每一行的第2、4個字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># tail -4 /etc/fstab | awk '{print $2,$4}'</span> / defaults /boot defaults /home defaults swap defaults</code></span></span></span>

注意:如果在命令行中沒有使用逗號分隔,則會被awk認為這是一個字段,并連接起來,如下:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># tail -4 /etc/fstab | awk '{print $2 $4}'</span> /defaults /bootdefaults /homedefaults swapdefaults</code></span></span></span>

?

在顯示的字段前插入字符串:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># tail -4 /etc/fstab | awk '{print "hello:",$2,$4}'</span> hello: / defaults hello: /boot defaults hello: /home defaults hello: swap defaults</code></span></span></span>

?

需要注意的是,只有在引號之外才可以做變量替換,因此在awk中要做變量替換時,不能用引號將之引起來,這里舉一個例子:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># tail -4 /etc/fstab | awk '{print "hello:",$2}'</span> hello: / hello: /boot hello: /home hello: swap <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># tail -4 /etc/fstab | awk '{print "hello:,$2"}'</span> hello:,<span style="color:#ee9900">$2</span> hello:,<span style="color:#ee9900">$2</span> hello:,<span style="color:#ee9900">$2</span> hello:,<span style="color:#ee9900">$2</span></code></span></span></span>

?

直接顯示每一行的內容:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print}' netstat.txt </span> Active Internet connections <span style="color:#999999">(</span>servers and established<span style="color:#999999">)</span> Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 10.10.10.140:49808 10.10.10.140:80 TIME_WAIT tcp 0 52 10.10.10.140:22 10.10.10.1:52641 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:51926 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:52640 ESTABLISHED tcp 0 0 10.10.10.140:49806 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49804 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49810 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:49812 10.10.10.140:80 TIME_WAIT <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

這里直接給出print相當于'print $0'。

?

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{print ""}' netstat.txt </span><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray">#</span></code></span></span></span>

awk會遍歷整個文件,文件有多少行,這里就顯示多少個空白行。

?

?

(2) printf語句:

語法:

printf "FORMAT" item1, item2, ...

?

功效:

格式化輸出:將各個item按位套進"FORMAT"指定的格式中,實現按照一定格式輸出的功能。

?

要點:

①"FORMAT"必須給出;

②不會自動換行,需要顯式給出換行控制符"\n";

③"FORMAT"需要分別為后面的每個item指定一個格式化符號(格式符).

?

格式符:

%c:顯示為字符的ASCII碼;

%d, %i:顯示為十進制整數;

%e, %E:以科學計數法顯示;

%f:顯示為浮點數;

%g, %G:以科學計數法或浮點形式顯示;

%s:顯示為字符串;

%u:顯示為無符號整數;

%%:顯示%自身.

?

修飾符:

每個格式符還可以有修飾符,可通過在格式符前面加上一些修飾符以控制其格式的顯示機制,因此稱為修飾符。

常用的修飾符有:

?#[.#]:第一個數字#表示顯示的寬度,后一個#表示小數點后的精度;

?-:以左對齊形式顯示;

+:顯示為數值的符號.

?

示例:

格式化輸出/etc/passwd文件中的第1列:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{printf "Username: %s\n",$1}' /etc/passwd</span> Username: root Username: bin Username: daemon Username: adm Username: lp Username: <span style="color:#dd4a68">sync</span> Username: <span style="color:#dd4a68">shutdown</span> Username: halt</code></span></span></span>

?

格式化輸出/etc/passwd文件中的第1列和第3列:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{printf "Username: %-18s UID: %d\n",$1,$3}' /etc/passwd</span> Username: root UID: 0 Username: bin UID: 1 Username: daemon UID: 2 Username: adm UID: 3 Username: lp UID: 4 Username: <span style="color:#dd4a68">sync</span> UID: 5 Username: <span style="color:#dd4a68">shutdown</span> UID: 6 Username: halt UID: 7</code></span></span></span>

?

(3) 操作符

操作符可用于PATTERN或者Action中,操作符主要有以下幾種:

?

①算術操作符

雙目:

x+y, x-y, x*y, x/y, x%y, x^y

?

單目:

-x:取相反數;

+x:將字符串轉換為數值;? ?

?

②字符串操作符

字符串切片:使用gawk內建函數;

沒有符號的操作符:表示連接字符串;

?

③比較操作符

>, >=

<, <=

==, !=

?

④賦值操作符

+=, -=, *=, /=, ^=, %=

++, --

?

⑤模式匹配符

~:左側的字符串是否被右側的PATTERN匹配;

!~:左側的字符串是否不被右側的PATTERN匹配;

?

⑥邏輯操作符

&&

||

!

?

⑦函數調用

無參數時:

function_name()

?

有參數時:

function_name(argu1, argu2, ...)

?

⑧條件表達式

selector?if-true-expression:if-false-expression

?

?

解釋:

"selector"是一個條件表達式,如果"selector"為真,則執行"if-true-expression"語句;如果"selector"為假,則執行"if-false-expression"語句。

?

示例:

顯示系統上所有用戶的用戶名及其說明其用戶類型:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or Sys</span> User<span style="color:#669900">";printf "</span>Username: %-18s Usertype: %s\n",<span style="color:#ee9900">$1</span>,usertype<span style="color:#999999">}</span>' /etc/passwd Username: root Usertype: Sysadmin or SysUser Username: bin Usertype: Sysadmin or SysUser Username: daemon Usertype: Sysadmin or SysUser Username: adm Usertype: Sysadmin or SysUser Username: lp Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">sync</span> Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">shutdown</span> Usertype: Sysadmin or SysUser Username: halt Usertype: Sysadmin or SysUser Username: mail Usertype: Sysadmin or SysUser Username: operator Usertype: Sysadmin or SysUser Username: games Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">ftp</span> Usertype: Sysadmin or SysUser Username: nobody Usertype: Sysadmin or SysUser Username: systemd-bus-proxy Usertype: Sysadmin or SysUser Username: systemd-network Usertype: Sysadmin or SysUser Username: dbus Usertype: Sysadmin or SysUser Username: polkitd Usertype: Sysadmin or SysUser Username: tss Usertype: Sysadmin or SysUser Username: postfix Usertype: Sysadmin or SysUser Username: sshd Usertype: Sysadmin or SysUser Username: tab Usertype: Common User Username: geoclue Usertype: Sysadmin or SysUser Username: apache Usertype: Sysadmin or SysUser Username: centos Usertype: Common User</code></span></span></span>

?

操作符同樣可使用在PATTERN中,例如,如果系統用戶的uid大于1000,則顯示其用戶名和uid(使用關系表達式):

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '$3>=1000{printf "Username: %-10s UID: %s\n",$1,$3}' /etc/p</span> asswd Username: tab UID: 1000 Username: centos UID: 1001</code></span></span></span>

?

(4) if-else條件判斷

語法格式:

if(condition) {statements}

if(condition) {statements} else {statements}

?

注意:

如果"{statements}"中只有一個語句時,則其花括號'{}'可省略;如果"{statements}"中有多個語句時,則其花括號'{}'不可省略!以下其他語句類同。

?

使用場景:

需要對awk取得的整行或某個字段做條件判斷時使用。

?

用法示例:

像剛才的例子,如果系統用戶的uid大于1000,則顯示其用戶名和uid,這里使用if-else語句來實現:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{if($3>=1000) {printf "Username: %-18s Usertype: Common Us</span> er\n<span style="color:#669900">",<span style="color:#ee9900">$1</span>} else {printf "</span>Username: %-18s Usertype: Sysadmin or SysUser\n",<span style="color:#ee9900">$1</span><span style="color:#999999">}</span><span style="color:#999999">}</span>' /etc/pas swd Username: root Usertype: Sysadmin or SysUser Username: bin Usertype: Sysadmin or SysUser Username: daemon Usertype: Sysadmin or SysUser Username: adm Usertype: Sysadmin or SysUser Username: lp Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">sync</span> Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">shutdown</span> Usertype: Sysadmin or SysUser Username: halt Usertype: Sysadmin or SysUser Username: mail Usertype: Sysadmin or SysUser Username: operator Usertype: Sysadmin or SysUser Username: games Usertype: Sysadmin or SysUser Username: <span style="color:#dd4a68">ftp</span> Usertype: Sysadmin or SysUser Username: nobody Usertype: Sysadmin or SysUser Username: systemd-bus-proxy Usertype: Sysadmin or SysUser Username: systemd-network Usertype: Sysadmin or SysUser Username: dbus Usertype: Sysadmin or SysUser Username: polkitd Usertype: Sysadmin or SysUser Username: tss Usertype: Sysadmin or SysUser Username: postfix Usertype: Sysadmin or SysUser Username: sshd Usertype: Sysadmin or SysUser Username: tab Usertype: Common User Username: geoclue Usertype: Sysadmin or SysUser Username: apache Usertype: Sysadmin or SysUser Username: centos Usertype: Common User</code></span></span></span>

?

顯示以"/bin/bash"為默認shell的用戶的用戶名:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{if($NF~/\/bin\/bash$/) print $1}' /etc/passwd</span> root tab centos或者: <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd</span> root tab centos</code></span></span></span>

這里分別結合了模式匹配符或比較操作符來實現。

?

以空白字符為分隔符,顯示/etc/fstab文件中字段數大于等于10的行:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{if(NF>=10) print}' /etc/fstab </span> <span style="color:slategray"># Created by anaconda on Sun Feb 19 10:02:11 2017</span> <span style="color:slategray"># See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info</span>或者: <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'NF>=10' /etc/fstab</span> <span style="color:slategray"># Created by anaconda on Sun Feb 19 10:02:11 2017</span> <span style="color:slategray"># See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info</span></code></span></span></span>

?

顯示空間使用率大于等于20%的掛載設備:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># df -h</span> Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 50G 9.6G 41G 20% / devtmpfs 982M 0 982M 0% /dev tmpfs 993M 0 993M 0% /dev/shm tmpfs 993M 8.7M 984M 1% /run tmpfs 993M 0 993M 0% /sys/fs/cgroup /dev/sda1 1014M 121M 894M 12% /boot /dev/mapper/cl-home 67G 33M 67G 1% /home /dev/sr0 7.8G 7.8G 0 100% /media/cdrom tmpfs 199M 0 199M 0% /run/user/0 <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># </span> <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># df -h | awk -F% '{print $1}' | awk '/\/dev/{if($NF>=20) print $1}'</span> /dev/mapper/cl-root /dev/sr0</code></span></span></span>

?

(5) while循環

語法格式:

while(condition) {statements}

?

循環條件:

條件為“真”,進入循環;

條件為“假”,退出循環.

?

使用場景:

①對一行內的多個字段逐一進行類似處理時使用;

②對數組中的各元素逐一處理時使用.

?

用法示例:

將/etc/grub2.cfg文件中以linux16開頭(前面可能有空白符)的行篩選出來,并逐一打印每一行的的各個字段及其每個字段的字符數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^[[:space:]]*linux16/{i=1; while(i<=NF) {print $i,length($i);</span>i++<span style="color:#999999">}</span><span style="color:#999999">}</span>' /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-514.el7.x86_64 30 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 ro 2 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17 rhgb 4 quiet 5 LANG<span style="color:#9a6e3a">=</span>en_US.UTF-8 16 linux16 7 /vmlinuz-0-rescue-c3d796ed1ad340e09e3d9024cd0350bf 50 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 ro 2 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17 rhgb 4 quiet 5</code></span></span></span>

注意:這里調用了awk的內建函數length()。

?

進一步:僅打印字符數大于7的字段:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^[[:space:]]*linux16/{i=1; while(i<=NF) {if(length($i)>7) {pr</span> int <span style="color:#ee9900">$i</span>,length<span style="color:#999999">(</span><span style="color:#ee9900">$i</span><span style="color:#999999">)</span><span style="color:#999999">}</span><span style="color:#999999">;</span> i++<span style="color:#999999">}</span><span style="color:#999999">}</span>' /etc/grub2.cfg /vmlinuz-3.10.0-514.el7.x86_64 30 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17 LANG<span style="color:#9a6e3a">=</span>en_US.UTF-8 16 /vmlinuz-0-rescue-c3d796ed1ad340e09e3d9024cd0350bf 50 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17</code></span></span></span>

?

(6) do-while循環

語法格式:

do {statements} while(condition)

?

解釋:

無論是否符合條件,先執行一次,而后再根據condition進行判斷。

?

使用場景:

至少需要執行一次時使用。

?

?

(7) for循環

語法格式:

for(expr1;expr2;expr3) {statements}

?

詳細格式:

for(variable assignment;condition;iteration process) {for-body}

?

特殊用法:

for(var in array) {for-body}

?

?

功效:能夠遍歷數組中元素的索引;

注意:其中var為變量,array為數組名,{for-body}為循環體。前面提到,awk具有內生循環功能,能自動實現對文本所有行的遍歷,而這里的for循環則可實現每一行的字段間的循環。

?

用法示例:

還是剛才的例子,將/etc/grub2.cfg文件中以linux16開頭(前面可能有空白符)的行篩選出來,并逐一打印每一行的的各個字段及其每個字段的字符數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^[[:space:]]linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg </span> linux16 7 /vmlinuz-3.10.0-514.el7.x86_64 30 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 ro 2 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17 rhgb 4 quiet 5 LANG<span style="color:#9a6e3a">=</span>en_US.UTF-8 16 linux16 7 /vmlinuz-0-rescue-c3d796ed1ad340e09e3d9024cd0350bf 50 root<span style="color:#9a6e3a">=</span>/dev/mapper/cl-root 24 ro 2 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/root 17 rd.lvm.lv<span style="color:#9a6e3a">=</span>cl/swap 17 rhgb 4 quiet 5</code></span></span></span>

?

(8) switch語句

語法格式:

switch(condition) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; case VALUE3 or /REGEXP3/: statement; default: statement}

?

(9) break和continue

功效:

break [n]:跳出n層循環;

continue:結束本輪循環并提前進入下一輪循環;

?

(10) next

功效:

next:提前結束對本行的處理而直接進入下一行。

?

next和continue的區別:

continue是用于控制行內字段間的跳轉的,而next是用于控制awk的內生循環以實現在行間的跳轉,從而提前進入下一行處理。

?

示例:

顯示uid為偶數的用戶的用戶名和uid

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd</span> root 0 daemon 2 lp 4 <span style="color:#dd4a68">shutdown</span> 6 mail 8 games 12 <span style="color:#dd4a68">ftp</span> 14 systemd-network 192 polkitd 998 sshd 74 tab 1000 apache 48</code></span></span></span>

?

(11) 數組(array)

定義數組:

array[index-expression]

?

注意:array為自定義的數組名,index-expression為索引表達式,awk支持索引數組和關聯數組,而在awk中關聯數組更為常用。

?

刪除數組:

delete array[index-expression]:刪除數組中的某元素;

delete array:刪除數組.

?

要點:

①awk支持關聯數組,可使用任何字符串;字符串要使用雙引號;

②如果數組中的某個元素事先不存在,在引用時,awk會自動創建這個元素,并將其值初始化為“空串”;而如果引用一個事先不存在的數組元素來做數值運算時,則會自動將該元素賦值為0.

③若要判斷數組中是否存在某元素,不可以直接引用,因為一引用就會自動創建(一創建就相當于存在了),而應該使用"index in array"格式來做判斷。

④若要遍歷整個數組中的元素,則要使用for循環:for(var in array) {for-body}.

?

用法示例:

創建一個關聯數組,數組第一個元素的索引為"mon",值為"Monday",第二個元素的索引為"tue",值為"Tuesday";創建之后顯示指定的數組元素:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print</span>weekdays<span style="color:#999999">[</span><span style="color:#669900">"mon"</span><span style="color:#999999">]</span><span style="color:#999999">}</span>' Monday</code></span></span></span>

當不需要對文件進行處理時,可在前面帶上"BEGIN"。

?

進一步:遍歷顯示數組中的所有元素:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i</span><span style="color:#0077aa">in</span> weekdays<span style="color:#999999">)</span> <span style="color:#999999">{</span>print weekdays<span style="color:#999999">[</span>i<span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>' Tuesday Monday</code></span></span></span>

使用for的特殊用法去遍歷數組中的每個元素時,例如此處,awk會將數組'weekdays'中的每個元素的索引賦值給變量i,而不是直接將數組的元素直接賦值給變量i。此處遍歷的順序可能和我們預想的不一致。

?

判斷數組中的某個元素是否存在:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{testarray["a"]="hello"; testarray["b"]="hi"; if("a" in t</span> estarray<span style="color:#999999">)</span> <span style="color:#999999">{</span>print <span style="color:#669900">"exist."</span><span style="color:#999999">}</span> <span style="color:#0077aa">else</span> print <span style="color:#669900">"not exist."</span> <span style="color:#999999">}</span><span style="color:#669900">' exist. [root@localhost ~]# [root@localhost ~]# awk '</span>BEGIN<span style="color:#999999">{</span>testarray<span style="color:#999999">[</span><span style="color:#669900">"a"</span><span style="color:#999999">]</span><span style="color:#9a6e3a">=</span><span style="color:#669900">"hello"</span><span style="color:#999999">;</span> testarray<span style="color:#999999">[</span><span style="color:#669900">"b"</span><span style="color:#999999">]</span><span style="color:#9a6e3a">=</span><span style="color:#669900">"hi"</span><span style="color:#999999">;</span> if<span style="color:#999999">(</span><span style="color:#669900">"c"</span> <span style="color:#0077aa">in</span> t estarray<span style="color:#999999">)</span> <span style="color:#999999">{</span>print <span style="color:#669900">"exist."</span><span style="color:#999999">}</span> <span style="color:#0077aa">else</span> print <span style="color:#669900">"not exist."</span> <span style="color:#999999">}</span>' not exist.</code></span></span></span>

?

根據前面提到,如果我們要引用數組中的某元素,而這個元素事先是不存在的,那么當我們引用時awk會自動創建這個元素,并且初始化為“空串”,當然了,如果我們直接把這個事先不存在的數組元素拿去做運算,則會自動初始化為“0”。在生產環境中,利用這一特性,我們可以實現一個通用而且非常實用的功能:當我們需要統計在文本中某些字符串各自分別出現的次數時,可以直接把這些字符串分別作為一個數組的索引,并且使得在各個要統計的字符串每次出現時,以該字符串作為索引的數組元素自動加1.

說起來有點抽象,接下來我們看一看如何利用這一特性:

?

用netstat命令查看當前網路連接狀態:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan</span> Active Internet connections <span style="color:#999999">(</span>servers and established<span style="color:#999999">)</span> Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 10.10.10.140:22 10.10.10.1:52641 ESTABLISHED tcp 0 52 10.10.10.140:22 10.10.10.1:51926 ESTABLISHED tcp 0 0 10.10.10.140:51816 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:51818 10.10.10.140:80 TIME_WAIT tcp 0 0 10.10.10.140:22 10.10.10.1:52640 ESTABLISHED tcp 0 0 10.10.10.140:51814 10.10.10.140:80 TIME_WAIT tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 10.10.10.140:80 10.10.10.140:49844 TIME_WAIT tcp6 0 0 10.10.10.140:80 10.10.10.140:50304 TIME_WAIT tcp6 0 0 10.10.10.140:80 10.10.10.140:49828 TIME_WAIT</code></span></span></span>

?

統計netstat命令執行結果中tcp連接的各個狀態的個數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan | awk '/tcp\>/{state[$NF]++}END{for(i in state) print i,state[i]}'</span> LISTEN 2 ESTABLISHED 3 TIME_WAIT 3</code></span></span></span>

命令解釋:

這里首先錨定匹配以'tcp'開頭的行;接著把匹配到的每一行的最后一個字段(即狀態)賦值為數組state的索引,這里因為事先state[$NF]不存在,所以awk會自動創建之,并將對應的數組元素初始化為“空串”;但又因為這里直接將數組元素用于自增運算,因此初始值為0,以用于做自增運算,而我們要統計的各個狀態每出現一次,就會自動把這個狀態所對應的數組state的索引對應的元素值加1.

最后我們只需要用for循環遍歷一次數組state的索引,并顯示索引(這里"索引"即為"狀態")以及對應的元素值(即各個狀態分別出現的次數)。

?

此外,在生產環境中通常使用ss命令結合awk工具來做統計,這樣執行性能更佳。

?

統計/var/log/httpd/access_log日志文件中各個ip地址從本地Web服務器獲取資源的次數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '{ip[$1]++}END{for(i in ip) print i,ip[i]}' /var/log/httpd/acce</span> ss_log 10.10.10.138 1014 10.10.10.1 221 10.10.10.139 4024 10.10.10.140 4000</code></span></span></span>

?

查看/etc/fstab文件內容:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># cat /etc/fstab </span><span style="color:slategray">#</span> <span style="color:slategray"># /etc/fstab</span> <span style="color:slategray"># Created by anaconda on Tue Oct 4 09:06:12 2016</span> <span style="color:slategray">#</span> <span style="color:slategray"># Accessible filesystems, by reference, are maintained under '/dev/disk'</span> <span style="color:slategray"># See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info</span> <span style="color:slategray">#</span> UUID<span style="color:#9a6e3a">=</span>60eb0d1c-9834-4348-9a79-2f91983a8ede / ext4 defaults 1 1 UUID<span style="color:#9a6e3a">=</span>3995456f-a3e9-4b69-a0de-0fd48068da39 /boot ext4 defaults 1 2 UUID<span style="color:#9a6e3a">=</span>01d24b59-eee4-472e-9985-ef44fd5e059c swap swap defaults 0 0 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid<span style="color:#9a6e3a">=</span>5,mode<span style="color:#9a6e3a">=</span>620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/sr0 /media/cd iso9660 defaults 1 2</code></span></span></span>

統計/etc/fstab文件中每個文件系統類型出現的次數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk '/^UUID/{fs[$3]++}END{for(i in fs) print i,fs[i]}' /etc/fstab </span> swap 1 ext4 2</code></span></span></span>

?

統計指定文件中每個單詞出現的次數,并統計出使用次數最多的英語單詞及其出現次數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># cat test.txt //打開一篇英語文章;</span> I am too busy now. The life is different <span style="color:#0077aa">in</span> the past and now. Let me tell you about my life. In the past,I didn<span style="color:#669900">'t study or do some things. I always played with my parents. My dad often took me to go to the zoo. That was really interesting! But now as a student, I have to stay in school all day. At home, I have too much homework to do.So I have to do homework. Time is flies. I miss past. I hope it back soon. [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# awk '</span><span style="color:#999999">{</span>for<span style="color:#999999">(</span>i<span style="color:#9a6e3a">=</span>1<span style="color:#999999">;</span>i<span style="color:#9a6e3a"><=</span>NF<span style="color:#999999">;</span>i++<span style="color:#999999">)</span> <span style="color:#999999">{</span>count<span style="color:#999999">[</span><span style="color:#ee9900">$i</span><span style="color:#999999">]</span>++<span style="color:#999999">}</span><span style="color:#999999">}</span>END<span style="color:#999999">{</span>for<span style="color:#999999">(</span>i <span style="color:#0077aa">in</span> count<span style="color:#999999">)</span> <span style="color:#999999">{</span>print i,c ount<span style="color:#999999">[</span>i<span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>' test.txt <span style="color:#9a6e3a">|</span> <span style="color:#dd4a68">sort</span> -r -n -k2 <span style="color:#9a6e3a">|</span> <span style="color:#dd4a68">head</span> -5 I 7 to 5 the 3 have 3 too 2</code></span></span></span>

?

(12) 函數

awk的函數有兩種類型,一種是內置函數,一種是自定義函數。這里我們介紹一下awk的內置函數吧!

?

數值處理:

rand():返回0和1之間的一個隨機數.

?

實例:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># awk 'BEGIN{print rand()}'</span> 0.237788</code></span></span></span>

注意:只有第一次取得的數是隨機的,之后會一直沿用第一次取得的值。

?

字符串處理:

length():返回指定字符串的長度;

sub(r,s,[t]):以r表示的模式去查找t所表示的字符串中匹配到的內容,并將其第一次匹配到的內容替換為s所表示的內容。

gsub(r,s,[t]):以r表示的模式去查找t所表示的字符串中匹配到的內容,并將其第所有匹配到的內容替換為s所表示的內容。

split(s,a[,r]):以r為分隔符切割字符s,并將其切割后的結果保存至a所表示的數組中。

?

注意:這里a所表示的數組的索引從1開始,而字段的各個切片分別保存至索引1,2,3,...中。

?

實例:

統計所有客戶端IP地址及其出現的次數:

<span style="color:#333333"><span style="color:#333333"><span style="color:black"><code class="language-bash"><span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan</span> Active Internet connections <span style="color:#999999">(</span>servers and established<span style="color:#999999">)</span> Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 52 10.10.10.140:22 10.10.10.1:51134 ESTABLISHED tcp 0 0 10.10.10.140:22 10.10.10.1:51531 TIME_WAIT tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># </span> <span style="color:#999999">[</span>root@localhost ~<span style="color:#999999">]</span><span style="color:slategray"># netstat -tan | awk '/^tcp\>/{split($5,ip,":"); count[ip[1]]++}END{for</span> <span style="color:#999999">(</span>i <span style="color:#0077aa">in</span> count<span style="color:#999999">)</span> <span style="color:#999999">{</span>print i,count<span style="color:#999999">[</span>i<span style="color:#999999">]</span><span style="color:#999999">}</span><span style="color:#999999">}</span>' 10.10.10.1 1 0.0.0.0 2</code></span></span></span>

命令解釋:

首先awk會匹配以tcp開頭的行,接著split()函數將模式(/^tcp\>/)匹配到的行的第5個字段以":"作為分隔符做切分,各個切片依次保存至ip所表示的數組中;而這里split()函數參數中,ip所表示的數組的索引是從1開始計數的,因此第5個字段":"左側的ip地址保存至ip[1],":"右側的端口號保存至ip[2];這里我們需要統計的是ip地址,所以按照前面幾個例題的思路,這里使用了數組元素嵌套的方法將ip[1]的值作為數組count的索引。

文章來源:http://blog.51cto.com/xuweitao/1905269

總結

以上是生活随笔為你收集整理的gawk用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久久久久久亚洲精品 | 久久极品 | 欧美日韩一区二区三区在线免费观看 | 美女福利视频一区二区 | 最近中文字幕完整视频高清1 | 精品一区二区电影 | 国产伦精品一区二区三区高清 | 四川妇女搡bbbb搡bbbb搡 | 亚洲精品999| 丁香激情五月婷婷 | 四虎成人av | 99久久精品国产免费看不卡 | av不卡免费看| 国产一区二区在线播放视频 | 国产成人福利在线 | 中文字幕在线久一本久 | 亚洲欧美日韩国产一区二区三区 | 日韩高清在线不卡 | 96av在线| 午夜美女福利直播 | 青草视频免费观看 | 国产精品久久久久一区二区三区 | 在线日韩av | www欧美xxxx| 久久免视频 | 日韩黄色中文字幕 | 久久视频中文字幕 | 日韩精品五月天 | 国产精品久久久亚洲 | 精品在线一区二区三区 | 欧美精品一区二区免费 | 91精品少妇偷拍99 | 中文字幕 91 | 欧美日韩视频精品 | 中文高清av | 久久久这里有精品 | 99精品视频在线看 | 午夜精品一区二区三区在线视频 | www黄com| 日韩va欧美va亚洲va久久 | 国内免费的中文字幕 | 国产精品一区二区三区电影 | 日本天天操| 黄色亚洲 | 国产手机视频在线观看 | 国产精品wwwwww | 97精品国产aⅴ | 园产精品久久久久久久7电影 | 91精品国产高清 | 十八岁以下禁止观看的1000个网站 | 日日爱夜夜爱 | 亚洲,播放| 国产成人精品不卡 | 中文字幕第一页在线 | 天天色天天干天天 | 亚州欧美视频 | 国产精品成人一区 | 91插插插免费视频 | 99久久精品国产免费看不卡 | 99色婷婷 | 在线观看免费高清视频大全追剧 | 最近最新mv字幕免费观看 | 麻豆 videos| 深夜免费小视频 | 亚洲精选在线观看 | 久久综合之合合综合久久 | .国产精品成人自产拍在线观看6 | 欧美日韩国产一二三区 | 欧美日本不卡视频 | 国产一区在线播放 | 久草视频精品 | 日本99精品 | 东方av免费在线观看 | 香蕉久久久久久久 | 成人黄色电影在线观看 | 亚洲永久国产精品 | 99爱在线| 亚洲欧洲一级 | 成人97视频一区二区 | 久久成人综合视频 | 精品国产123 | 国产精品乱码一区二三区 | 精品一区二三区 | 久久高清视频免费 | 天天躁日日躁狠狠躁 | 亚洲人成网站精品片在线观看 | av噜噜噜在线播放 | 丁香激情婷婷 | 久久久久一区二区三区四区 | 麻豆视频在线免费 | 欧美视频www | av电影中文 | 国产午夜三级一二三区 | 在线观看中文 | 久久99在线视频 | 国产原创在线观看 | 国产一区二区三区黄 | 草 免费视频| 亚洲欧美日韩精品久久奇米一区 | 免费黄a大片 | 久久99在线视频 | 超碰人人草| 人人草人人草 | 国产精品国产三级国产aⅴ9色 | 日韩精品一区二区免费视频 | 成片人卡1卡2卡3手机免费看 | 国产小视频在线观看 | 欧美黄色软件 | 久久麻豆视频 | 99re久久精品国产 | 国产乱对白刺激视频不卡 | 精品毛片一区二区免费看 | 玖玖精品在线 | 国产精品一区二区吃奶在线观看 | 国产区高清在线 | 久久综合婷婷综合 | 国产免费一区二区三区网站免费 | 香蕉视频18 | 日韩精品无码一区二区三区 | 国产精品99久久久久 | 免费精品视频在线观看 | 国产看片网站 | 99精品国产高清在线观看 | 欧美色888 | 91爱爱电影 | 国产精品午夜在线 | 91av手机在线观看 | 夜又临在线观看 | 久久黄页 | 手机看国产毛片 | 99久久99久久免费精品蜜臀 | 国产精品一区免费在线观看 | 日韩精品一区二区三区高清免费 | 天天鲁天天干天天射 | www..com毛片| 久久深夜福利免费观看 | 一区二区三区精品在线视频 | 免费看搞黄视频网站 | 亚洲精品在线观 | 麻豆视频在线免费观看 | 欧美性春潮 | 国产精品中文字幕在线播放 | 国产精品福利在线播放 | 亚洲欧洲一区二区在线观看 | 六月天综合网 | 欧美另类v | 亚洲精品欧美视频 | 黄色片免费看 | 国产综合激情 | 91九色蝌蚪| 日韩免费电影一区二区三区 | a级片网站 | 最近更新的中文字幕 | 国产福利一区二区在线 | 精品视频免费看 | 成人蜜桃视频 | 激情丁香久久 | 98涩涩国产露脸精品国产网 | 在线免费观看黄色av | 波多野结衣在线观看一区 | 久久精品香蕉 | 91亚色视频 | 成人黄色一级视频 | 国产在线观看二区 | 四虎视频 | 丁香久久综合 | 日日爽日日操 | 久久精品国产精品亚洲 | 日韩欧美精品一区 | 日韩欧美国产精品 | 天天射天天舔天天干 | 99久久精品免费看国产免费软件 | 在线免费观看黄网站 | 成人在线一区二区三区 | 一二区精品 | 婷婷色 亚洲 | 国产精品一区二区久久久久 | 日韩欧美一区二区在线观看 | 91精品网站在线观看 | 热久久最新地址 | 欧美日韩在线观看一区二区 | 香蕉视频日本 | 亚洲人久久久 | 中文字幕在线观 | 在线看国产日韩 | 久久爽久久爽久久av东京爽 | 色操插| 国产亚洲片 | 日韩视频一区二区三区 | 国产精品一区二区在线观看免费 | 国产精品女人久久久久久 | 六月色 | 国产精品久久久久久久毛片 | 日韩综合视频在线观看 | 免费观看久久 | 国产福利电影网址 | 国产精品久久久久久高潮 | 国产精品久久久久久久久免费看 | 欧美精品首页 | 一区二区三区四区免费视频 | 国产五十路毛片 | 日韩久久久久久久久 | 娇妻呻吟一区二区三区 | 日韩免 | 欧美精品乱码99久久影院 | 黄色成人av | 国产精品免费久久久久 | 92中文资源在线 | www.99av| 免费热情视频 | 成人在线免费小视频 | 日韩免费视频一区二区 | 亚洲 成人 一区 | 欧美日韩高清国产 | 天天天干夜夜夜操 | 黄色特一级 | www.五月天 | 日韩精品一区二区在线 | 成人a视频在线观看 | 91国内产香蕉 | 国产日本亚洲 | 国产福利一区二区三区视频 | 国产精品久久久久aaaa | 国产一区二区在线精品 | 久久激情综合网 | 米奇四色影视 | 国产精品专区h在线观看 | av在线a| 另类五月激情 | 国产欧美高清 | 久草国产在线观看 | 日韩动漫免费观看高清完整版在线观看 | 中文字幕亚洲综合久久五月天色无吗'' | 欧美a视频在线观看 | 欧美日韩一区二区在线 | 西西4444www大胆视频 | 久久草精品 | 久久国产精品久久国产精品 | 国产高清免费 | 久久亚洲精品国产亚洲老地址 | 日本黄色a级大片 | 西西444www高清大胆 | 视频在线观看99 | 91精品国产综合久久福利不卡 | 免费亚洲成人 | 亚洲欧美色婷婷 | 1区2区视频 | 久久国产免| 亚洲午夜久久久综合37日本 | 天天草天天色 | 国产不卡av在线播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费av小说| 久草在线免费在线观看 | 三级黄色片子 | 黄色亚洲| 91中文在线视频 | 亚洲精品在线二区 | 久久久久久久久影院 | 亚洲高清在线观看视频 | 在线看成人 | 中文字幕电影一区 | 久久国产精品色婷婷 | 免费观看第二部31集 | 国产精品视频资源 | 欧美精品中文在线免费观看 | 射射射av | 99免费看片 | 激情五月婷婷综合网 | mm1313亚洲精品国产 | 亚洲视频在线观看免费 | 开心色插| 四虎国产永久在线精品 | 国产精品11 | 一区 二区 精品 | 日韩欧美在线中文字幕 | 国产日产精品一区二区三区四区的观看方式 | 成人久久视频 | 久久久影片| 天堂网在线视频 | 天天射日 | 波多野结衣电影一区二区三区 | 国产精品日韩欧美 | 亚洲国产精品一区二区久久,亚洲午夜 | 国产精品视频久久 | 欧美日韩在线视频一区 | 高潮久久久久久久久 | 国产精品久久久久久久免费观看 | 亚洲免费婷婷 | 免费成人av在线看 | h视频日本 | 国产精品久久久久亚洲影视 | 开心色停停 | 日韩女同一区二区三区在线观看 | 激情深爱五月 | 久久99中文字幕 | 国产精品6 | 亚洲乱码久久 | 日韩精品一二三 | 九九免费在线观看视频 | 日韩欧美视频 | 久久a久久 | 99热这里有精品 | 精品成人久久 | 9草在线 | 99热这里只有精品在线观看 | 中文字幕在线影院 | 日韩av一区二区在线影视 | 免费午夜视频在线观看 | 亚洲视频大全 | 日韩免费观看一区二区三区 | 亚洲精品玖玖玖av在线看 | 国产亚洲午夜高清国产拍精品 | 婷婷丁香五 | 看片网站黄 | 在线观看日韩中文字幕 | av一区二区三区在线 | 国产精品久久二区 | 香蕉久草 | avove黑丝 | 国产专区在线看 | 国产尤物在线观看 | 91精品一区二区三区蜜臀 | 日韩av不卡在线 | 久久精品视频国产 | 色综合久久久久综合体桃花网 | 亚洲香蕉视频 | 91麻豆精品国产91久久久无需广告 | 精品国产aⅴ麻豆 | 久久a久久 | 丁香婷婷激情 | 久久人人爽人人爽人人片av软件 | 黄色在线小网站 | 欧美一性一交一乱 | 99精品久久精品一区二区 | 最新日韩电影 | 黄色国产高清 | 91最新网址在线观看 | 日日夜夜骑 | 日韩免费看 | 91成人免费观看视频 | 热re99久久精品国产66热 | 久久精品久久久精品美女 | 日本中文字幕免费观看 | 91精品综合在线观看 | 色综合五月天 | 亚洲视频在线免费看 | 国产精品美乳一区二区免费 | 日日摸日日碰 | 在线观看黄 | 探花视频在线观看+在线播放 | 天天干天天草 | 色诱亚洲精品久久久久久 | 91精品国产成人观看 | 国产精品久久伊人 | 激情综合亚洲精品 | 成人av播放 | 亚洲第一伊人 | 亚洲黑丝少妇 | 国产一区二区三区 在线 | 国产精品乱码一区二区视频 | 黄色亚洲大片免费在线观看 | 久久99久久99精品免视看婷婷 | 午夜少妇av| 国产精品视频不卡 | 欧洲精品码一区二区三区免费看 | 四虎最新入口 | 超碰在线人人草 | 亚洲欧美日韩在线看 | 人人澡澡人人 | 日韩动态视频 | 亚洲成人中文在线 | 99精品国产免费久久 | 99国内精品久久久久久久 | 免费黄色在线网址 | 天海冀一区二区三区 | 国产伦理精品一区二区 | 国产精品v欧美精品 | 国产91影视 | 日韩乱色精品一区二区 | 亚洲成人软件 | 天天操天天玩 | 丁香久久综合 | 日本亚洲国产 | 婷婷网五月天 | 日韩区在线观看 | 五月开心激情 | 日韩精品不卡 | 伊人婷婷色 | 西西大胆啪啪 | 亚洲精品在线免费播放 | 日韩精品免费在线视频 | 在线观看亚洲专区 | 一本一本久久a久久精品牛牛影视 | 久久久久久久免费观看 | 91日韩精品视频 | 中文字幕在线免费观看视频 | 国产在线a视频 | 久久精品99国产精品亚洲最刺激 | 久久精品日韩 | 天天看天天干 | 亚洲婷婷在线 | 国产人成在线观看 | 日本午夜在线亚洲.国产 | 亚洲三级毛片 | 久久久影片 | 久久另类视频 | 国产午夜精品视频 | 久99久中文字幕在线 | 亚洲精品美女久久久久 | 国产第一页在线观看 | 免费高清在线视频一区· | 在线看国产精品 | 色噜噜噜噜 | 丁香午夜婷婷 | 日韩午夜三级 | 成人黄色av免费在线观看 | 婷婷色 亚洲 | 99视频久久 | 人人看人人草 | 三级视频国产 | 视频国产在线 | 亚洲第一区在线观看 | 久久精品99久久久久久2456 | 国产视频欧美视频 | 97色在线观看 | 一级免费黄视频 | 日本三级吹潮在线 | 欧美成人h版在线观看 | 欧美色图亚洲图片 | 天堂在线一区 | 色婷婷久久久 | 亚洲激情 欧美激情 | 色伊人网| 免费日韩 精品中文字幕视频在线 | 综合五月婷婷 | www五月天婷婷 | 91九色蝌蚪视频在线 | 国产精品理论视频 | 日韩国产在线观看 | 日韩在线视频二区 | 热久久免费视频精品 | 婷婷激情影院 | 午夜国产在线 | 国产视频在线观看一区 | 天天拍天天色 | 欧美国产一区在线 | 在线观看成人一级片 | 亚洲区精品 | 91在线中文字幕 | 久久av一区二区三区亚洲 | 国产日韩欧美精品在线观看 | 草久在线观看 | 91手机在线看片 | 免费高清在线观看成人 | 六月丁香在线观看 | 日本一区二区不卡高清 | 在线观看免费国产小视频 | 狠狠色狠狠色合久久伊人 | 久操久 | 自拍超碰在线 | 欧美日韩精品久久久 | 97看片网 | 九九免费在线观看视频 | 久操视频在线观看 | 成年人免费电影在线观看 | www.97视频| 国产视频中文字幕在线观看 | 国产a高清 | 色夜视频 | 欧美精品v国产精品v日韩精品 | 日韩久久精品一区二区 | 色丁香久久 | 日韩精品一区二区在线观看 | 国产精品久久久久久久久久了 | 超碰在线人 | 成人在线免费看 | 天天干 夜夜操 | 91在线日韩 | 日韩精品一区二区三区在线播放 | 亚洲一级电影 | 久久精品老司机 | 91精品无人成人www | 欧美精品久 | 美女视频网站久久 | 日韩中文字幕国产 | 国产破处在线视频 | 丝袜美女在线观看 | 综合激情| 久色 网| 97国产精品亚洲精品 | 国产亚洲婷婷免费 | 久久99电影 | 亚洲 欧美 综合 在线 精品 | 亚洲不卡av一区二区三区 | 9色在线视频 | 五月天综合在线 | 婷婷狠狠操| 国产精品久久久久久久久蜜臀 | 国产日本三级 | 国产免费午夜 | 在线a视频免费观看 | 国产视频一 | 99久久久国产精品免费观看 | 成人av电影免费在线观看 | 天天操人 | 国内久久久久久 | 亚洲日韩精品欧美一区二区 | 久久久亚洲麻豆日韩精品一区三区 | 国产日本在线播放 | 色综合在 | 免费成人在线视频网站 | 国产高清 不卡 | 天天操天天射天天爽 | 丁香影院在线 | 视频成人永久免费视频 | 日韩深夜在线观看 | 国产99久久九九精品免费 | 午夜av一区二区三区 | 亚洲做受高潮欧美裸体 | 亚洲黄色成人av | 夜夜夜夜猛噜噜噜噜噜初音未来 | 婷婷色狠狠 | 色偷偷人人澡久久超碰69 | 国产99一区视频免费 | 五月天婷亚洲天综合网精品偷 | 韩日精品视频 | 国产欧美综合视频 | 九色精品免费永久在线 | 国产一二三在线视频 | 99久久精品国产免费看不卡 | 亚洲自拍av在线 | 婷香五月 | 亚洲国产综合在线 | 玖玖在线观看视频 | 黄色国产高清 | 久久免费视频精品 | 精品国产_亚洲人成在线 | 国产精品综合久久久久 | 在线免费黄色 | 日韩a免费 | 日韩一级成人av | 亚洲美女视频网 | 99c视频高清免费观看 | av在线影视 | 久久免费视频这里只有精品 | 精油按摩av | 亚洲乱码国产乱码精品天美传媒 | 日韩欧美99 | 一本一道久久a久久综合蜜桃 | 国产成人综 | 中文字幕国产一区二区 | av蜜桃在线 | av丝袜在线 | 天堂av免费观看 | 人人澡人人模 | 天天干.com | 日韩免费一级电影 | 香蕉视频网站在线观看 | 一本一本久久a久久精品综合 | 激情伊人五月天久久综合 | 精品视频免费观看 | 超碰在线天天 | 国产日韩一区在线 | 一本一道波多野毛片中文在线 | 日韩高清成人在线 | 日韩欧美一区二区在线播放 | 欧美精品久久久久a | 日韩高清片 | 欧美精品久久天天躁 | 国产色a在线观看 | 日韩免费一区二区三区 | 欧美小视频在线观看 | 91精品在线麻豆 | 日本中文字幕观看 | 在线色视频小说 | 夜夜躁日日躁狠狠久久88av | 婷婷六月综合网 | 久久99精品视频 | 久久不卡国产精品一区二区 | 欧美精品久久久久久久久久久 | 玖玖玖影院 | 这里只有精品视频在线观看 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 激情丁香综合五月 | 日本中文字幕观看 | 色网站黄 | 五月婷婷毛片 | 国产精品v欧美精品 | 狠狠色香婷婷久久亚洲精品 | 精品字幕| 四虎国产精品永久在线国在线 | 国产精品久久99综合免费观看尤物 | 亚洲精品国精品久久99热 | 综合激情av| 欧美a级一区二区 | 97成人精品视频在线播放 | 日韩免费在线视频 | www免费看片com | 日韩视频免费在线 | 99九九免费视频 | 久久久综合九色合综国产精品 | 亚洲高清视频在线 | 久久国产热视频 | 亚洲国产日韩一区 | 色网站在线免费观看 | 亚洲91精品在线观看 | 国产视频 久久久 | 男女激情片在线观看 | 麻豆一区二区 | 国产精品资源 | 成人在线免费观看视视频 | 黄色www| 91传媒在线观看 | 久久看免费视频 | 亚洲欧美日韩一二三区 | 国产成人61精品免费看片 | 国产精品亚洲a | 国产精品久久久久久久毛片 | 国产精品免费在线视频 | 手机看国产毛片 | 久久综合色一综合色88 | 国产精品黄色 | 永久免费精品视频 | 国产精品毛片一区视频播 | 少妇bbbb揉bbbb日本 | 最新av免费| 中文字幕亚洲高清 | 干av在线 | 在线国产一区二区 | 国产不卡av在线播放 | 五月天狠狠操 | 国产三级视频在线 | 99精品视频99| 日韩中文免费视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产精品久久久久一区二区 | 日韩三级视频在线观看 | 91视频91蝌蚪| 午夜精品久久久久久久99无限制 | 人人玩人人添人人澡超碰 | www看片网站 | 久久久久综合网 | 国产一级性生活 | 国产成人性色生活片 | 国产第一二区 | 免费日韩一级片 | 免费视频 你懂的 | 91精品国产一区二区三区 | 正在播放 久久 | 国产成人一区二区三区影院在线 | 国产美女精品人人做人人爽 | 欧美在线观看视频一区二区三区 | 国产色婷婷精品综合在线手机播放 | 久久天天躁狠狠躁亚洲综合公司 | 97国产大学生情侣白嫩酒店 | 丁香午夜婷婷 | 免费看的黄色录像 | 黄色片网站大全 | 亚洲精品小视频在线观看 | 人人爱人人做人人爽 | 国产精品24小时在线观看 | 在线观看免费福利 | 天天爽夜夜爽精品视频婷婷 | 91在线观看欧美日韩 | 豆豆色资源网xfplay | 99se视频在线观看 | 国产青青青 | 亚洲爱爱视频 | 四虎最新入口 | 日韩精品一区电影 | 人人爽人人爽人人爽学生一级 | 亚洲永久精品在线观看 | 国产日韩精品一区二区三区 | 亚洲精品av中文字幕在线在线 | 欧美日韩一区二区三区不卡 | 中文av在线免费观看 | www.av在线播放| 激情欧美一区二区免费视频 | av中文天堂在线 | 九九综合九九综合 | 免费在线观看日韩欧美 | 啪啪午夜免费 | 91 中文字幕 | 最近中文字幕免费视频 | 久久亚洲欧美 | 日韩精品一区二区三区免费观看视频 | 国产精品久久久一区二区三区网站 | 国产中文字幕视频在线观看 | 日本性久久 | 亚洲成a人片在线www | 国产五月色婷婷六月丁香视频 | 黄色网中文字幕 | 91精品视频一区二区三区 | 天天爱天天射天天干天天 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 成人av在线影院 | 久久精品99久久久久久2456 | 狠狠狠色丁香综合久久天下网 | 久久免费视频99 | 狠狠干婷婷色 | 久久成人国产精品免费软件 | a级国产片 | 精品久久久久久综合 | 国产亚洲在线 | 国产韩国日本高清视频 | 成年人免费看的视频 | 欧美精品久久99 | av片在线观看免费 | 日韩在线观看中文 | 国产99视频在线观看 | 国产区欧美| av成人在线观看 | 国产精品久久久久一区二区三区共 | 亚洲精品综合久久 | 99久热在线精品 | 色先锋资源网 | 国产亚洲久一区二区 | www色综合| 99久久精品国产系列 | 欧美一级片免费播放 | 婷婷色网站 | 91黄色成人 | 国产一性一爱一乱一交 | 中文字幕在线久一本久 | 麻豆传媒视频观看 | 久久久免费网站 | 国产三级久久久 | 麻豆一区二区 | 天天草天天干天天射 | 精品久久久久久一区二区里番 | 欧美精品xxx | 69中文字幕 | 日韩欧美中文 | 成人av在线一区二区 | 日韩精品一区在线播放 | 亚洲欧美国产精品久久久久 | 日日婷婷夜日日天干 | 亚洲精品国产精品乱码在线观看 | 在线观看视频在线 | 国产在线播放一区二区三区 | 国产日韩欧美综合在线 | 亚洲人成在线电影 | 四虎影视精品永久在线观看 | 麻豆精品视频在线 | 香蕉视频国产在线观看 | 最近免费中文字幕mv在线视频3 | 93久久精品日日躁夜夜躁欧美 | 国产资源网 | 精品免费视频. | 婷婷亚洲综合 | 欧美精品乱码久久久久久 | 韩日成人av | 日日躁夜夜躁aaaaxxxx | 成人午夜电影久久影院 | 91热| 国产人免费人成免费视频 | 色网址99 | www最近高清中文国语在线观看 | 99在线精品观看 | 美女网站在线看 | 成人毛片a| 97视频在线观看成人 | 国产精品白丝jk白祙 | 日韩免费看的电影 | 国产一级久久久 | 久久精品直播 | 亚洲国产视频网站 | 久久久在线免费观看 | 成人h动漫精品一区二 | 国产精品成人一区二区 | 免费黄色一区 | 中国一级片在线观看 | 99精品美女 | 欧美精品久久久久久久久久白贞 | 久久久久久久久精 | 成人黄色片免费 | 国产免费嫩草影院 | 成人欧美一区二区三区黑人麻豆 | 91精品国产自产91精品 | 久久综合色播五月 | 人人干在线观看 | 成人精品视频久久久久 | 色婷婷国产精品一区在线观看 | 色噜噜日韩精品一区二区三区视频 | 欧美日韩国产一区 | 日韩av高清在线观看 | 丁五月婷婷 | 97成人在线观看视频 | 永久免费的啪啪网站免费观看浪潮 | 黄色天堂在线观看 | 天天干天天草 | 国产96av| 亚洲欧美va| 日韩欧美高清在线观看 | 亚洲欧美国产精品va在线观看 | 欧美地下肉体性派对 | 欧美色婷婷 | 最近中文字幕大全 | 日本激情中文字幕 | 青春草视频在线播放 | 夜又临在线观看 | 国产黄色大片 | 久久人人爽人人爽人人片av软件 | 9在线观看免费 | www.伊人网.com | 精品在线一区二区三区 | 天天操天天舔天天干 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 成人影片免费 | 国产又粗又猛又色又黄网站 | 国产精品综合久久久久久 | 丁香久久激情 | 日韩三级视频在线观看 | 中文字幕一区二区三区久久蜜桃 | 精品国产伦一区二区三区免费 | 97在线观视频免费观看 | 久久精品视频4 | 日本高清xxxx | 午夜精品一区二区三区免费视频 | 国产精品国产三级国产aⅴ入口 | 99久久er热在这里只有精品15 | 国产亚洲精品成人av久久影院 | 色在线高清 | 国产精品成人aaaaa网站 | 在线观看一 | 波多野结衣亚洲一区二区 | 亚洲区视频在线 | 2019精品手机国产品在线 | 色爱成人网 | 欧美在线观看视频免费 | 免费网站在线 | 精品久久五月天 | 国产精品久久久久影视 | 国产一区二区精 | 爱色av.com | 国产精品久久久久毛片大屁完整版 | 久久草av | 国产精品免费久久久久久久久久中文 | 久久伊人精品天天 | 五月天色综合 | 免费v片| 97成人在线免费视频 | 成人综合婷婷国产精品久久免费 | 日韩中文字幕免费视频 | 在线观看一二三区 | 久久综合一本 | 丁香婷婷综合色啪 | 欧美日韩高清在线观看 | 国产日产精品一区二区三区四区的观看方式 | ww视频在线观看 | 国产精品男女 | 久久99影院| 国产成人精品一区二区三区网站观看 | 成人av影视 | 国产xxxxx在线观看 | 色婷婷88av视频一二三区 | 午夜视频欧美 | 2024国产精品视频 | 国产又粗又猛又爽又黄的视频先 | 久久99久久99精品免观看软件 | 免费在线观看不卡av | 亚洲涩涩网站 | 成人羞羞视频在线观看免费 | 4438全国亚洲精品观看视频 | 天天操天天怕 | 欧美日韩高清在线 | 久草在线欧美 | 日韩欧美一区二区三区视频 | 久久久国产在线视频 | 日韩欧美一区二区不卡 | 18久久久久 | 久草国产在线观看 | av网站地址 | 91香蕉亚洲精品 | 精品美女在线视频 | 成人精品影视 | 国产视频精品久久 | 欧美黑人xxxx猛性大交 | 天天射综合| 99久久精品国产亚洲 | 国产999视频| 久久久久中文字幕 | 久久免费视频一区 | 国产亚洲视频在线免费观看 | 精品国产免费一区二区三区五区 | 欧美性护士 | 91精品国产91久久久久 | 色吧久久| 91社区国产高清 | 午夜精品久久久久久久99热影院 | 免费看黄在线 | 97视频总站| 综合久久久久久 | 日韩欧美国产成人 | 麻豆免费观看视频 | 蜜臀av夜夜澡人人爽人人 | 深爱开心激情 | 日日干视频 | 国产精品久久久久av免费 | 亚洲国产精品va在线看黑人 | 国外调教视频网站 | 91最新地址永久入口 | 久久久精品综合 | 国产在线精品区 | 亚洲精品乱码久久久久v最新版 | 在线看不卡av | 看片网站黄色 | 国产视频一区在线免费观看 | 91精品久久久久久久久久久久久 | 日韩免费av片 | 国内精品福利视频 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久爽爽爽 | 久久视频免费观看 | 免费在线国产 | av国产在线观看 | 日日躁天天躁 | 国产一级精品绿帽视频 | 欧美精品免费视频 | 深爱激情站 | 久久久国产高清 | 亚洲最大成人免费网站 | 国产亚洲午夜高清国产拍精品 | 国产精华国产精品 | 超碰97人人射妻 | 日韩免费在线视频观看 | 亚洲视频一区二区三区在线观看 | 国产中文a | 97超碰人人模人人人爽人人爱 | 91高清在线看 | 日本九九视频 | 久久久久久久久久久综合 | 夜色成人av| 国内精品久久久久久中文字幕 | 欧美成人黄色 | 亚洲午夜久久久久久久久电影网 | 久久久国产精品亚洲一区 | 亚洲综合色丁香婷婷六月图片 | 在线看国产视频 | 中文国产字幕在线观看 | 久草在线视频资源 | 黄色av一区二区三区 | 黄网站色欧美视频 | 精品久久久99 | 国产精品一区二区三区四区在线观看 | 中文字幕在线观 | 激情www| 亚洲成av人片一区二区梦乃 | 婷婷精品国产一区二区三区日韩 | 久久亚洲精品国产亚洲老地址 | 国产精品久久在线观看 | 一区二区欧美在线观看 | 波多野结衣在线视频免费观看 | 91福利社区在线观看 | 天天躁日日躁狠狠躁av麻豆 | 99精品免费视频 | 麻豆91精品91久久久 | 午夜精品电影一区二区在线 | 日韩精品资源 | 欧美日韩视频精品 | 97在线观看免费观看高清 | 999热视频 | 天天干,天天射,天天操,天天摸 | 欧美激情片在线观看 | 国产区高清在线 | 在线天堂v | 草免费视频 | 91在线看片 | 日av免费| 免费婷婷 | 久久综合网色—综合色88 | 国产精品精品久久久 | 国产原厂视频在线观看 | 国产精品一区二区三区免费看 | 韩国精品视频在线观看 | 久久亚洲福利视频 | 日韩三级在线观看 | 国产九九九精品视频 | 91精品国产乱码久久 | 国产福利一区二区三区在线观看 | 国产精品久久免费看 | 亚洲成av人影院 | 久综合网| 国产伦精品一区二区三区… | av噜噜噜在线播放 | 亚洲开心激情 | 中文字幕免费观看全部电影 | 久久精品黄| 五月天中文在线 | 国产96av| 日韩av一卡二卡三卡 | www免费看 | 精品一区二区免费 | 色视频一区 | 四虎永久网站 | 最新在线你懂的 | 久久综合视频网 |