私はファイルの最初の行が特定のパターンと一致することを確認し、一致した場合はファイルを印刷したいスクリプトを書いています。この目標をどのように達成できますか?
スキーマを確認する方法は?パターンを確認して出力に応じて何かをする方法がありますか..
編集:この質問を見てください。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
オンラインで自分を置き換えることです1st
。ed
指定したパターンが存在しない場合はエラーが発生するため(ファイル全体の印刷)、,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
txt
pattern
最初の行が拡張正規表現に一致する現在のディレクトリの非表示のファイル名を印刷します。サポートさ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も小さな作業で簡単に管理できるはずです。