awk默認(rèn)是以行為單位處理文本的,對(duì)test.txt中的每一行都執(zhí)行后面 "{ }" 中的語句。
- 若有一個(gè)需要重新格式化的字典test.txt(用戶名、密碼、地址):
xiaosan sadasdw jiaozuo
234wer asdfasd asdas
1111 aaaa cccc
2222 aaaa degd
1111 aaaa cccc
3333 aaaa dfger
21asd sdfsd sadasd
dwqx asds sasdfcv
- 要求:
1.里面有重復(fù)數(shù)據(jù),使用命令去重
2.提取出用戶名和密碼 每一行前面加上id數(shù)字,遞增。
3.只提取出密碼作為爆破字典
4.某些公司都是一個(gè)公司前綴+姓名簡(jiǎn)寫,所以為用戶名一欄全部改為uv_用戶名
5.提取出密碼一列,有些密碼爆破成功率高,所以增加一列,標(biāo)出密碼出現(xiàn)次數(shù)
去重:
[wyb@localhost ~]$ cat test.txt | awk '!a[$1]++'
[wyb@localhost ~]$ cat test.txt | uniq //作用和上面命令相同
aosan sadasdw jiaozuo
234wer asdfasd asdas
1111 aaaa cccc
2222 aaaa degd
3333 aaaa dfger
21asd sdfsd sadasd
dwqx asds sasdfcv
去重、添加id:
一般字典不需要id、user、pass等標(biāo)示符,這里只是為了便于觀看
[wyb@localhost ~]$ cat test.txt | awk '!a[$1]++' | awk -F '\t' '{print "id:"NR"\tuser:"$1"\tpass:"$2"\taddress:"$3}' | column -t //最后一個(gè)命令可以將列對(duì)齊
id:1 user:aosan pass:sadasdw address:jiaozuo
id:2 user:234wer pass:asdfasd address:asdas
id:3 user:1111 pass:aaaa address:cccc
id:4 user:2222 pass:aaaa address:degd
id:5 user:3333 pass:aaaa address:dfger
id:6 user:21asd pass:sdfsd address:sadasd
id:7 user:dwqx pass:asds address:sasdfcv
去重、添加id、添加公司前綴:
[wyb@localhost ~]$ cat test.txt | awk '!a[$1]++' | awk -F '\t' '{print "id:"NR"\tuser:uv_"$1"\tpass:"$2"\taddress:"$3}'
id:1 user:uv_aosan pass:sadasdw address:jiaozuo
id:2 user:uv_234wer pass:asdfasd address:asdas
id:3 user:uv_1111 pass:aaaa address:cccc
id:4 user:uv_2222 pass:aaaa address:degd
id:5 user:uv_3333 pass:aaaa address:dfger
id:6 user:uv_21asd pass:sdfsd address:sadasd
id:7 user:uv_dwqx pass:asds address:sasdfcv
去重然后輸出密碼:
[wyb@localhost ~]$ cat test.txt | awk '!a[$1]++' | awk -F '\t' '{print "pass:"$2}'
pass:sadasdw
pass:asdfasd
pass:aaaa
pass:aaaa
pass:aaaa
pass:sdfsd
pass:asds
輸出密碼、得到密碼出現(xiàn)次數(shù):
下面的'a[$1]++'是按第一列來去重的,若有兩條數(shù)據(jù)只有第一列重復(fù)則成功,可以用$0按行來去重
[wyb@localhost ~]$ cat test.txt | awk '!a[$1]++' | awk -F '\t' '{print $2}' | awk '{a[$1]++} END {for (j in a) print a[j],j}'
1 sadasdw
1 sdfsd
1 asdfasd
1 asds
3 aaaa
uniq 只能去除挨著的重復(fù)數(shù)據(jù),所以先sort升序排序,然后uniq -c統(tǒng)計(jì)重復(fù),再sort -r降序排序
cat test.txt | awk '{print $2}' | sed '1d' |sort | uniq -c |sort -r
其他:
對(duì)'!a[$1]++'的解釋如下:
- a[e54r56wer]為空,!a[e54r56wer]為真,可以輸出,然后++
- 若再來一個(gè)a[e54r56wer],因?yàn)樯弦徊揭呀?jīng)++,此時(shí)值為1,!a[e54r56wer]為假,不輸出,再++
對(duì)for輸出數(shù)組的解釋如下:
awk '{a[$1]++} END {for (j in a) print a[j],j}' test.txt
- 在遍歷完文件后,通過END把后面的句子連起來
- for (j in a) 是指打印數(shù)組a的下標(biāo),并定義下標(biāo)為變量j
- 最后print a[j],j就是打印數(shù)組下標(biāo)和數(shù)組,這樣就相同的$1排重并計(jì)數(shù)