2017-01-31 58 views
0

我目前工作的一个脚本,该脚本将寻找通过nm输出,并使用金额$1列的值进行迭代UNIX命令nm和总和输出以下使用AWK的多个文件

read $filename 
nm --demangle --size-sort --radix=d ~/object/$filename | { 
    awk '{ sum+= $1 } END { print "Total =" sum }' 
} 

我想对任意数量的文件执行以下操作,循环访问目录然后输出结果摘要。我想要每个文件的结果以及添加所有列的第一列的结果。

我仅限于使用bash和awk。

回答

0

你需要把读取的$文件名在一段时间;做;完成循环并将整个循环的输出提供给awk。

例如

while read filename ; do 
     nm ... $filename 
done | awk '{print $0} { sum+=$1 } END { print "Total="sum}' 

awk {print $ 0}将打印每个文件的行,以便您可以看到每个文件的行。

+0

我建议'而IFS =读-r filename' - 这样我们不要从输入中删除反斜杠或前导/尾随空白。并且在扩展中引用''$ filename“',或许在前面加上'--',以允许以破折号开头的文件名正常工作。 (因此:'nm ... - “$ filename”') –

+0

......除此之外,考虑到它缺乏这个特性,这是一个比'awk'运行子进程更好考虑的分工设施允许这样做安全。 –

+0

这工作完美! – Euler1707

0

庆典globstar选项是递归的文件匹配
你可以在年底awk命令使用像**/*.txt

$ shopt -s globstar 
$ awk ' 
    BEGINFILE { 
     c="nm --demangle --size-sort --radix=d \"" FILENAME "\"" 
     while ((c | getline) > 0) { fs+=$1; ts+=$1; } 
     printf "%45s %10'\''d\n",FILENAME, fs 
     close(c); fs=0; nextfile 
    } END { 
     printf "%30s %s\n", " ", "-----------------------------" 
     printf "%45s %10'\''d\n", "total", ts 
    }' **/*filename* 
+0

如果我们有一个恶意文件名 - 例如,一个用'touch'./$(rm -rf $ HOME)创建的文件'' - 这会非常非常不幸。希望这样的目录完全不存在于二进制文件中,但如果下一个人可能正在循环上传目录,最好不要教人们“这是一个用awk循环文件的好习惯”。 –