1つのコマンドラインステートメントにGrepの2つの異なる要件があります。

1つのコマンドラインステートメントにGrepの2つの異なる要件があります。

この文字列を含む最後の3行を印刷する方法と、#includeこのtester.c文字列を含む行が3行未満の場合に印刷します。フルファイル

これまで私は以下を持っています:

grep "#include" tester.c | tail -3

しかし、要件の後半をどのように含めるべきかわかりません。これは宿題であり、答えは一行でなければなりませんが、いいえ、;とてもわかりません。

ベストアンサー1

tail -33行以上を印刷せずに3行以下で印刷します。したがって、「grep」が3つ以下の一致する行を見つけると、tailはそれらをすべて標準出力に渡します。一致するものが3つ以上の場合は、tail3行だけに制限してください。

あなたのコマンドが正確に必要なので、ここに投稿する前に問題を解決しました。

夜に働くと、これが起こります:)

編集:あなたの質問を誤って読んだ可能性があります。

一致するファイルが3つ未満の場合にファイル全体を印刷するには、次の手順を実行します。

f="testfile.c" && C=3 && [ $(grep -c "#include" ${f}) -lt ${C} ] && cat ${f} || grep "#include" ${f} |tail -${C}

ただし、潜在的に遅いFS(NFSなど)を処理したり、行が多いファイルや非常に長い行があるファイルを処理したりする場合は、読みすぎる必要があるため、遅すぎる可能性があります。ファイルをダブル。

f="testfile.c" && C=3 && CONTENT=$(cat "${f}") && MATCHES=$(echo "$CONTENT"|grep "#include"|tail -${C}) && [ $(echo "$MATCHES" | wc -l) -lt ${C} ] && echo "$CONTENT" || echo "$MATCHES"

これにより、ファイルを一度だけ開いて読み取ることができますが、RAM(ストレージデバイスよりはるかに高速です)にバッファリングされます。 RAMが不足しているかファイルをバッファリングするのにコストがかかりすぎる場合は、[ファイルを2回開く]最初のコマンドを使用すると速度が遅くなりますが、OSやアプリケーションは中断されません。 「D」状態に閉じ込められている場合が高くなります... OSにも良くありません...)

おすすめ記事