仅当第一行匹配特定模式时如何打印文件内容?

Mat*_*hew 11 text-processing regular-expression files

我正在编写一个脚本,我想检查文件的第一行是否与某个模式匹配,如果匹配,则打印出文件。我怎样才能做到这一点?

我如何检查模式?有没有办法检查模式并根据输出做一些事情..

编辑:请看一下这个问题:https : //stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file

我想要这样的东西,但没有一个对我有用。我基本上想检查第一行是否与正则表达式模式匹配,并根据它打印文件行。

don*_*sti 17

你可以这样做ed

ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN
Run Code Online (Sandbox Code Playgroud)

这里的关键是要尝试更换PATTERN1st与自己一致。ed如果找不到指定的模式,则会出错,因此,p(打印整个文件)只有在1s/PATTERN/&/成功时才会执行。

或与sed

sed -n '1{
/PATTERN/!q
}
p' infile
Run Code Online (Sandbox Code Playgroud)

qUITS如果第一行不(!)匹配PATTERN,否则它prints所有行。
或者,正如Toby Speight所指出的,使用 GNU sed

sed '1{/PATTERN/!Q}' infile
Run Code Online (Sandbox Code Playgroud)

Q与相同q但不打印模式空间。


cuo*_*glm 15

使用 POSIX 工具箱:

{ head -n 1 | grep pattern && cat; } <file
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 8

 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt
Run Code Online (Sandbox Code Playgroud)

将打印的非隐藏的名字txt在当前目录中,其第一行中,扩展正则表达式匹配的文件pattern那些awkinplementations的支持nextfile

如果您想打印整个文件内容而不是打印文件名,则可以执行以下操作:

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt
Run Code Online (Sandbox Code Playgroud)

这很有效,因为它只运行一个命令,但awk不是转储文件内容的最有效命令,对于大文件,您可以通过执行以下操作获得更好的性能:

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat
Run Code Online (Sandbox Code Playgroud)

也就是说,仅用于awk打印匹配(0 分隔)的文件列表并依赖于cat转储其内容。


ter*_*don 6

如果你正在编写一个 shell 脚本,你可以像

for file in ./*; do head -n 1 "$file" | grep -q 'PATTERN' && cat "$file"; done
Run Code Online (Sandbox Code Playgroud)

或者,在 Perl 中:

perl -Tlne '$f = /PATTERN/ if $. == 1; print if $f; $. = 0 if eof' ./*
Run Code Online (Sandbox Code Playgroud)


小智 5

Oldschool,只需将您的句子翻译成标准命令:

for file in *; do
    if head -n 1 "${file}" | grep -q 'PATTERN'; then
        cat "${file}"
    fi
done
Run Code Online (Sandbox Code Playgroud)

对于学习 bash 来说,这是一个好的开始。如果您只需要快速解决方案,请尝试使用 sed-、awk- 或 perl-answers。两者都不错,但它们是您需要(并且可能想要)学习的自己的语言。

这是一个非常简单的例子,所以如果你想了解更多,你也可以在 ruby​​、php、js(例如在 nodejs 中)或任何其他允许文件访问的语言中尝试相同的方法。即使是 C/C++ 或 Java 也应该很容易管理一个小任务。