似乎无法只搜索第一行文字

Can't seem to search just first line of text

我使用以下命令仅在文件的第一行搜索报告名称。它正在搜索整个文件。我以为 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}' {} \;

感谢任何帮助。

我只想return文件名。它以 6 位数字作为文件名掩码查找过去八小时。

您似乎假设 /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}' {} \;

包含关键指针 - 您 必须使用 && 进行逻辑 AND 而不是 range - 但命令可以在两个方面提高效率:

  • 给定输入文件的短路处理,以便处理在第一行之后停止。
  • 传递(通常)所有文件到单个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 }' {} +

此命令只查看每个输入文件的第一行。


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