awk默認(rèn)是以行為單位處理文本的角溃,對test.txt中的每一行都執(zhí)行后面 "{ }" 中的語句望抽。
- 若有一個需要重新格式化的字典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.某些公司都是一個公司前綴+姓名簡寫墅冷,所以為用戶名一欄全部改為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 //最后一個命令可以將列對齊
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)計重復(fù)世蔗,再sort -r降序排序
cat test.txt | awk '{print $2}' | sed '1d' |sort | uniq -c |sort -r
其他:
對'!a[$1]++'的解釋如下:
- a[e54r56wer]為空,!a[e54r56wer]為真朗兵,可以輸出污淋,然后++
- 若再來一個a[e54r56wer],因為上一步已經(jīng)++余掖,此時值為1寸爆,!a[e54r56wer]為假,不輸出盐欺,再++
對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排重并計數(shù)