stringList
ディレクトリを再帰的に検索してその中のすべての文字列をstringList
検索したい文字列のリストがあります。いいえすべての検索結果に表示されます。今私に
cat stringList | grep -qrf /dev/stdin .
しかし、それ以降はどこに行くべきかわかりません。
たとえば、文字列があります。
金持ち
バー
ブザー音
ディレクトリ内のファイルのうちfooのみが存在します。スクリプトを返す必要があります。
バー
ブザー音
答え1
努力する:
string="foo
bar
baz"
echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
この方法は、入力ファイルを一度だけ読み取るために選択されました。
どのように動作しますか?
find . -type f -exec cat {} +
これはファイルの再帰検索を実行し、その内容を標準出力に出力します。
grep -o "$string"
これにより、行に一致するテキストが選択されます
$string
。echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
grep -v
再帰的に検索されたファイルのいずれかで見つからなかった文字列のすべての行を返します。
はい
以下に次のファイルを含むディレクトリを考えてみましょう。
$ find . -type f -exec cat {} +
bar none
Here baz scaggs
behind bars
bazooka
grepを追加すると、一致する単語だけが得られます。
$ find . -type f -exec cat {} + | grep -o "$string"
bar
baz
bar
baz
すべてをまとめてみると、foo
ファイルにない唯一の単語は次のようになります。
$ echo "$string" | grep -v "$(find . -type f -exec cat {} + | grep -o "$string")"
foo
答え2
あなたはこれを行うことができますgawk
:
find . -type f -print0 | gawk -v listfile=/path/to/stringList '
BEGIN{
while ((getline string < listfile) > 0) list[string]
RS="\0"
while ((getline file < "/dev/stdin") > 0) ARGV[ARGC++] = file
RS="\n"
}
{for (s in list) if (index($0, s)) delete list[s]}
END {for (s in list) print s}'