似乎无法搜索第一行文字

时间:2016-03-01 13:27:17

标签: unix awk find aix

我使用以下内容仅搜索文件的第一行以获取报告名称。它正在搜索整个文件。我以为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小时。

2 个答案:

答案 0 :(得分:3)

hek2gml's answer包含关键指针 - 您必须使用&&进行逻辑AND 而不是范围 - 但命令可以更多在两个方面有效:

  • 给定输入文件的短路处理,以便在第一行之后停止处理。
  • 将{em>所有文件传递给 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)拨打\; 一次,与在原始解决方案尝试中一样(仅读取每个文件的第一行,但为每个文件调用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 }' \;

答案 1 :(得分:2)

您似乎认为/My Report Title/,NR==1是一种由,分隔的条件列表。这个假设是错误的。

在这种情况下,正确的是使用逻辑AND 运算符&&来连接条件:

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}' {} \;