将总行数添加到文件结尾bash

时间:2015-04-21 05:08:31

标签: bash unix scripting grep wc

我在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)"

3 个答案:

答案 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)
}'