2016-03-01 47 views
1

我正在使用以下内容仅搜索报告名称的第一行文件。它正在搜索整个文件。我认为NR == 1只会搜索第一行。我认为我的语法不好。似乎无法仅搜索文本的第一行

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/,NR==1 {print FILENAME; exit}' {} \; 

任何帮助表示赞赏。

我只想返回文件名。它使用6位数字作为文件名掩码查找过去8个小时。

+0

如果你想要的是文件名,为什么与'awk'里面的文件进行搜索? Find的'-print'选项将打印文件名。 – ghoti

+3

它应该是'/我的报告标题/&& NR == 1' – hek2mgl

+0

标题是在第一行,这就是为什么我需要awk。感谢hek2mgl工作完美! –

回答

3

hek2gml's answer包含的关键指针 - 你必须使用逻辑&&而非范围 - 但该命令可以在两方面提高效率:

  • 对给定输入文件进行短路处理,以便处理在第一行之后停止。
  • 传递(通常)所有文件到单个awk呼叫,通过终止-exec初级与+而非\;
find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ { print FILENAME } { nextfile }' {} + 

此命令永远只着眼于第1行每个输入文件。


nextfile是不符合POSIX严格,因此,如果您awk没有它(GNU awk中,Mawk,和BSD/OSX awk完成 - 不知道AIX),使用(效率较低,因为它必须读取每个文件的所有行):

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk 'FNR == 1 && /My Report Title/ { print FILENAME }' {} + 

如果在没有nextfile,你宁愿放弃awk一次为每个文件-exec终止\;),如在原有解决方案的尝试(读只有每个fi的第一行乐,但呼吁awk一次每个文件):

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ { print FILENAME } { exit }' \; 
+0

如果没有'nextfile'命令,这会使情况变得更糟,因为它需要扫描文件的所有行而不是第一行。但是,使用'nextfile'命令,它可能会显示更好的性能,因为'awk'只会根据需要调用,而不是每个文件。无论如何,我怀疑'{} +'是否是可移植的。看看同事苹果,不要! – hek2mgl

+0

@ hek2mgl:是的,但是被'+'调用的_single_'awk'调用的效率抵消了 - 很难说这种情况下哪一个更好(取决于文件大小,磁盘速度等等)。 'nextfile'肯定是要走的路,但我不知道AIX的'awk'实现是否具有它。我用'\;'和(单个)文件短路添加了替代解决方案。 – mklement0

+1

@EdMorton:'-exec ... \;'调用_each_文件的命令; '-exec ... +'用_as命令调用它,因为它可以放在命令行上(通常是所有;比如'xargs')。我已经为我的答案添加了一个基于'\;'的替代方案,以防'nextfile'不可用。总的来说,最有效的组合是'nextfile' +'-exec ... +'。 – mklement0

2

看起来你认为/My Report Title/,NR==1将是由,分开的一种条件列表。这个假设是错误的。

权在这种情况下会使用逻辑与运营商&&来连接条件:

find /SYM/SYM000/REPORT/ -type f -mmin -480 \ 
    -name '[0-9][0-9][0-9][0-9][0-9][0-9]' \ 
    -exec awk '/My Report Title/ && NR==1 {print FILENAME; exit}' {} \;