如何防止awk中的子shell扩展

时间:2014-03-05 15:38:32

标签: bash awk gawk

我有一个awk脚本,我需要在其中计算哈希值,其中一些文件名出现在我正在处理的文件的第一个字段中。我目前正在使用:

command="sha1sum "$1
command | getline hash

不幸的是,该命令在被传送到getline之前经历了shell扩展。对于包含空格或其他特殊字符的文件名,这会有问题。我怎样才能以允许任意字符的文件名的方式完成任务?

编辑: 某些示例文件名可能包含foo(2).txtx&y.mp3

我也会在这里包括整个程序,因为它不会太长。目的是从文本文件中获取文件名列表并搜索重复文件。

#take a list of filenames and compute sha1sums to look for duplicates
BEGIN {storage[0]=0}
{
    command="sha1sum "$1
    command | getline hash
    split(hash, line)
    #storage array has the sha1sum hash as a key and the filename as a value
    #check each hash in storage, and report the duplicate if the current
    #sum matches any encountered before
    hash_exists=0
    for (x in storage) {
        if (x == line[1]) {
            hash_exists=1
            print("Duplicate found: " line[2])
        }
    }

    if (hash_exists == 0) {
        storage[line[1]]=line[2]
    }

    close(command)
}

2 个答案:

答案 0 :(得分:3)

$ ll file\ with\ spaces
-rw-rw-r-- 1 foo foo 0 Mar  5 16:49 file with spaces

$ echo "file with spaces" | awk -F: '{
    command="sha1sum \"" $1 "\"";
    command | getline line
    print line
}'
da39a3ee5e6b4b0d3255bfef95601890afd80709  file with spaces

答案 1 :(得分:1)

使用sha1sum

添加set -f;前缀

实施例

$ touch f\*
$ nawk 'BEGIN {
  command="set -f;sha1sum f*"
  command | getline hash
  print hash
}'
da39a3ee5e6b4b0d3255bfef95601890afd80709  f*