テキストファイルセットを検索し、次のファイルの名前を返そうとします。指定された行にテキストパターンを含むか、指定されたテキストを含めません。私の場合は、最後の行にテキストパターンが含まれていないファイルのファイル名を返す必要があります。
ファイル1.txt
line1 abc
line2が必要です
ファイル2.txt
line1はline2が私を返すようにしなければなりません。
"must have"が渡された場合、関数/コマンドは最後の行に "must have"が含まれていないため、file2.txtのみを返す必要があります。
ベストアンサー1
現在のディレクトリにあるすべてのファイルの最後の行の内容を調べるには、次のようにtail
しますgrep
。
for file in *.txt
do
tail -1 -- "$file" | grep -q "must have" || printf '%s\n' "$file"
done
これはテキストファイルの名前です.txt
。以降に指定されたとします。必要に応じてワイルドカードを調整します。tail -1
ファイルの最後の行をつかんで(後方に表示する方がファイルを前に読むよりも効率的です)、その行にパイプして必要なgrep
テキストを見つけます。 grepのフラグはジョブを-q
静かにし、それに応じて戻りコードを設定するように指示します。 grepがそうであればいいえ一致するものが見つかると、||
「or」はシェルに実行を交互に指示してprintf
ファイル名を出力します。
このコードをスクリプトまたは関数に入れることができます。
lastlinehas() {
for file in *.txt
do
tail -1 -- "$file" | grep -q "$1" || printf '%s\n' "$file"
done
}