我在bash中有两个语句要组合,以便输出全部在一个文件中。有没有办法将这些结合起来?第二行基本上做的是在文件底部添加总行数。我希望它与文件的格式排列,这就是为什么我想以某种方式将两者结合起来。任何帮助将不胜感激!
grep -E -o -r "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" $ARCHIVE | sed 's/.*@//' | sort -r | uniq -ic | sort -nr | sed 's/^ *//g' | awk ' { t = $1; $1 = $2; $2 = t; print; } ' | column -t > temp2
echo Total "$(wc -l < temp2)"
答案 0 :(得分:2)
awk
可以很好地跟踪行数。取代
awk ' { t = $1; $1 = $2; $2 = t; print; }'
使用:
awk ' { t = $1; $1 = $2; $2 = t; print; } END{print "Total",NR}'
在awk中,NR
是已读取的记录(行)数。只有在读取了所有行之后才执行END
块。因此,这会将总计数放在文件的末尾,从而无需使用最终的echo Total "$(wc -l < temp2)"
语句。
答案 1 :(得分:0)
替换
| column -t > temp2
与
| column -t | tee temp2 | wc -l
答案 2 :(得分:0)
没有任何样本输入来测试甚至看不到,这显然是未经测试的,包括一些猜测工作,但它基本上是正确的方法(使用GNU awk并假设“$ ARCHIVE”是一个目录):
find "$ARCHIVE" -type f -print |
xargs awk '
BEGIN { FPAT="[[:alnum:]_%+-]+@[[:alnum:]_%+-]+[.][[:alpha:]]{2,6}" }
{
$0 = tolower($0)
for (i=1;i<=NF;i++) {
sub(/.*@/,"",$i)
cnt[$i]++
width = (length($i) < width ? width: length($i))
}
}
END {
PROCINFO["sorted_in"] = "@ind_val_desc"
for (host in cnt) {
printf "%-*s %s\n", width, host, cnt[host]
}
printf "%-*s %s\n", width, "Total", length(cnt)
}'