我有一个文件,其中包含以下形式的 URL 列表
编辑
http://www.google.com/absd/siidfs/kfd837382$%^$&,
www.google.com,
谷歌网站
yahoo.com/list/page/jhfjkshdjf...
我想编写一个显示以下输出的脚本
google.com : 2
http://www.google.com: 1
yahoo.com : 1
我被困在必须从文件中读取 URL 并再次检查整个文件的部分。我是 bash 脚本新手,因此我不知道该怎么做。
答案1
原始输入文件
假设输入格式如下:
http://www.google.com,
www.google.com,
google.com
yahoo.com
结果如下:
google.com : 3
yahoo.com : 1
很难确定您所处的整个情况,但考虑到您向我们展示的输出,我倾向于首先转换输入文件,以便所有行都采用以下形式:
google.com
google.com
google.com
yahoo.com
然后通过以下命令集运行该文件:
$ grep -v "^$" data.txt | \
sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
sort | uniq -c
3 google.com
1 yahoo.com
您可以清理输出的格式,使其符合您想要的格式,如下所示:
$ grep -v "^$" data.txt | \
sed -e 's/,$//' -e 's/.*\.\(.*\)\.\(.*\)$/\1.\2/' | \
sort | uniq -c | \
awk '{printf "%s : %s\n", $1, $2}'
google.com : 3
yahoo.com : 1
编辑#1
OP 有一个后续问题,他更改了示例中的输入。因此要计算此类输入:
http://www.google.com/absd/siidfs/kfd837382$%^$&,
www.google.com,
google.com
yahoo.com/list/page/jhfjkshdjf...
您可以使用第一个示例中经过修改的单行代码:
$ grep -v "^$" data2.txt | \
sed -e 's/,$//' \
-e 's#\(http://[^/]\+\).*#\1#' \
-e '/^[^http]/ s/^www\.//' \
-e '/^[^http]/ s#\([^/]\+\).*$#\1#' | \
sort | uniq -c | \
awk '{printf "%s : %s\n", $1, $2}'
2 : google.com
1 : http://www.google.com
1 : yahoo.com
答案2
您可能想使用sort
和uniq -c
来获得正确的计数,然后使用sed
或awk
进行最终格式化。像这样的东西:
sort file | uniq -c | awk '{printf "%s : %s\n", $1, $2}'
您最初的问题可能可以用相同的基本管道来回答,但首先编辑输入:
sed -e 's/http:\/\///' -e 's/^www\.//' file | sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'
如果这不完全正确,您可以修改sed
和awk
命令以使主机名形式和输出格式正确。例如,要清除较长 URL 的右侧:
sed -e 's/http:\/\///' -e 's/^www\.//' -e 's/\/..*$//' file |
sort | uniq -c |
awk '{printf "%s : %s\n", $1, $2}'