2017-06-06 77 views
0

我有一个脚本在文件中执行多个验证。 验证之一是检查一行是否超过95个字符(包括空格)。如果是,则会返回行数超过95个字符的行号。下面是用于验证的命令:awk命令返回不一致的结果

$(cat $FileName > $tempfile) 
totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4]) 
if [[$totalCharacters != "" ]]; then 
    totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4] | cut -d : -f1 | tr "\n" ",") 
    echo "line too long" 
    exit 1 
fi 

在较低的环境中的代码按预期工作。但在生产中,有时候验证会返回错误“行太长”,但不返回任何行号。我们只是重新编写脚本,它不会返回任何错误。

我想知道在使用的命令中可能出错。 以前的开发人员说这可能是使用awk命令的问题,但我不确定,因为这是我第一次遇到使用awk命令。

+0

你觉得呢'$(猫$文件名> $临时文件)'是要干什么?我认为它会将'$ FileName'命名的文件与'tempfile'连接起来,并将输出放在文件'$'中。然后捕获标准输出 - 幸运的是标准输出为空 - 并将该输出解析为命令并运行。你不需要'$(...)',你可能想使用'cat“$ FileName”>“$ tempfile”' - 虽然不清楚为什么你需要一个输入的副本来处理;你显然可以使用原始文件。 –

+0

请注意'grep -vn [9] [4]'命令是奇数;它与'grep -vn 94'相同并搜索不包含'94'的行(输出行号和匹配文本)。请注意,这意味着长度为'194','294','940','1945'等的行将不会被选中(以及长度为“94”的行)。 –

+0

对不起,我没有注意到tempFile之前的空间,当我在这里编写代码时,你是正确的,它应该是$ tempFile。输入的副本可能只是用于备份,当我得到多次修改的脚本时就是这样。对于grep-vn [9] [4],我不知道它不会选择这些行,我向他解释的是,grep会检查文件是否有多于94个字符的行。 – Patrick

回答

2

这是写得不好。所有你需要的是:

awk 'length>94{print NR; f=1} END{exit f}' file 

如果有超过94个字符的行,它会打印行号和退出状态1;否则退出状态将为0并且不会生成输出。

+0

我想如果有人想要看中并输出长度,他们可以使用'{printf'l:%-6d c:%3d \ n“,NR,length; F = 1} ...' –

0

您的脚本应该仅仅是:

awk ' 
    length()>95 { printf "%s%d", (c++?",":""), NR } 
    END { if (c) {print "line too long"; exit 1} } 
' "$FileName" 
相关问题