某個目錄下有兩個檔案a.txt和b.txt,檔案格式為(ip,username),
列如:
a.txt
127.0.0.1 zhangsan
127.0.0.1 wangxiaoer
127.0.0.2 lisi
127.0.0.3 wangwu
b.txt
127.0.0.4 lixiaolu
127.0.0.1 lisi
每個檔案至少100萬行,請使用Linux指令完成如下工作:
1)每個檔案各自的ip數
2)出現在b.txt而沒有出現在a.txt的ip
3)每個user出現的次數以及每個user對應的ip數
答:1)
cat a.txt | awk -F" " '{print $1}' | sort -u > ipa.txt
wc -l ipa.txt
cat b.txt | awk -F" " '{print $1}' | sort -u > ipb.txt
wc -l ipb.txt
2)
diff ipa.txt ipb.txt | grep \> | awk -F" " '{print $2}'
3)
cat a.txt b.txt | awk -F" " '{u[$1" "$2]+=1} END{for(i in u) print i,u[i]}'
| awk -F" " '{u[$2]+=$3;ip[$2]+=1} END{for(i in u) print i,u[i],ip[i]}'
用到linux指令介紹:
1\awk
awk -F” ” ‘BEGIN{} {} END{}’
如: cat a.txt | awk -F” ” ‘{u[$1]+=1} END{for(i in u) print i,u[i]}’
注: 1)-F” ” : F表示分隔符,其後緊跟分隔符,用雙引号括起來,不指定分隔符預設使用空格分隔
2)單引号中的語句-‘BEGIN{} {} END{}’可分成三部分:
BEGIN表示{}之前執行的語句,且隻執行一次;
{}中的語句對于檔案中的每一行執行一次;
END表示所有{}執行結束之後才執行一次的語句.
2\grep
grep str file : 從file中查找所有含有str串的行,并傳回該行内容
grep -r update /etc/acpi : 查找指定目錄/etc/acpi 及其子目錄(如果存在子目錄的話)下所有檔案中包含字元串”update”的檔案,并列印出該字元串所在行的内容
3\豎線’|’表示管道,前面指令的輸出作為後面語句的輸入
4\sort
sort file : 對file内容按遞增排序(不去重),但并不修改源檔案
sort -r file : 對file内容按遞減排序(不去重),不改源檔案
sort -u file > newfile: 對file内容進行排序(去重),但并不修改源檔案,而是輸入newfile中
5\‘>’
‘>’file : 表示輸出至file内
若要表示字元大于号’>’,使用\>轉義.
6\wc
wc -l(–lines) file : 統計檔案有多少行
wc -c(–chars,–bytes) file : 統計檔案含有多少個位元組
7\diff
diff filea fileb
注:1)若filea\fileb都有序,則該指令可以錯位對齊; 2)若有一個無序,則嚴格按行比對;
設ipa.txt中内容為:有序
127.0.0.1
127.0.0.2
127.0.0.3
設ipb.txt中内容為:有序
127.0.0.1
127.0.0.3
127.0.0.4
diff ipa.txt ipb.txt -y -W 50 (錯位對齊)
127.0.0.1 127.0.0.1
127.0.0.2 <
127.0.0.3 127.0.0.3
> 127.0.0.4
再使用grep \> 即可取出ipb中有而ipa中沒有的ip