最初の行が特定のパターンと一致する場合にのみファイルの内容を印刷する方法は?

最初の行が特定のパターンと一致する場合にのみファイルの内容を印刷する方法は?

私はファイルの最初の行が特定のパターンと一致することを確認し、一致した場合はファイルを印刷したいスクリプトを書いています。この目標をどのように達成できますか?

スキーマを確認する方法は?パターンを確認して出力に応じて何かをする方法がありますか..

編集:この質問を見てください。https://stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file

私はこのようにしたいが、そのうちの誰も私には適していません。デフォルトでは、最初の行が正規表現パターンと一致することを確認し、それに基づいてファイル行を印刷したいと思います。

答え1

あなたはこれを行うことができますed

ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN

ここでの秘訣はPATTERNオンラインで自分を置き換えることです1sted指定したパターンが存在しない場合はエラーが発生するため(ファイル全体の印刷)、,p成功した場合にのみ実行されます。1s/PATTERN/&/

または以下を使用してsed

sed -n '1{
/PATTERN/!q
}
p' infile

q最初の行が!()と一致しない場合はこれがPATTERN行われ、そうでない場合はpすべての行が印刷されます。
または指摘したようにトビースペート、GNUを使用するsed

sed '1{/PATTERN/!Q}' infile

Qと同じqですが、パターンスペースを印刷しません。

答え2

POSIXツールボックスの使用:

{ head -n 1 | grep pattern && cat; } <file

答え3

 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt

txtpattern最初の行が拡張正規表現に一致する現在のディレクトリの非表示のファイル名を印刷します。サポートさawkれる実装nextfile

ファイル名を印刷するのではなく、ファイル全体の内容を印刷するには、次のようにします。

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt

これは単一のコマンドのみを実行するために機能しますが、awkファイルの内容をダンプするのに最も効率的なコマンドではありません。以下を行うと、より良いパフォーマンスが得られます。

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat

つまり、awk一致する(0で区切られた)ファイルのリストを印刷し、catその内容をダンプすることに依存します。

答え4

昔ながらの文章を標準コマンドに翻訳してください。

for file in *; do
    if head -n 1 "${file}" | grep -q 'PATTERN'; then
        cat "${file}"
    fi
done

これはbashを学ぶための良いスタートです。簡単な解決策が必要な場合は、sed、awk、またはperlの回答を試してください。どちらも大丈夫ですが、学ぶべき(おそらく)自分だけの言語です。

これは非常に簡単な例なので、もっと詳しく知りたい場合は、Ruby、PHP、js(Nodejsなど)、またはファイルへのアクセスを許可する他の言語で同じ内容を試すこともできます。 C / C ++やJavaも小さな作業で簡単に管理できるはずです。

関連情報