2016-09-29 10 views
-1

配列要素がファイル内にあるかどうかを確認するためのbashスクリプトを書いています。例えば配列要素がファイル内にあるかどうかを調べる

私は私が含まれているファイルをループに探していた文字列

123400 452612 9999A0 1010EB

のパターンを含むファイルを持っているエラーerrors=("1234" "5678" "9999")

の配列を持っていますエラーをチェックし、配列要素のいずれかがファイル内の文字列パターンと一致するかどうかを確認します。そうであれば、後で処理するためにファイル内で一致した配列パターンを返します。

どうすればいいですか?

+0

ファイルに複数の行がありますか? (または)それらの固定パターンを持つ単一行ですか? – Inian

+0

ファイル内のどこにエラーが表示されますか? –

+0

エラーはファイル内のどこにでも表示されます。このファイルには、固定長のない複数の行が含まれています。 –

答えて

1

スクリプトがスクリプトは、アレイから上記2つのキーを意味

$ ./script.sh 
1234 
9999 

が持つ出力を生成サンプルファイルの

#/bin/bash 
errors=("1234" "5678" "9999") 

for error in "${errors[@]}" 
do 
    grep -o "$error" file 
done 

$ cat file 
123400 452612 9999A0 1010EB 

、このように書きますファイル内で一致します。 grep-oフラグは、配列から一致する部分のみを識別することです。 man grepページからの抜粋

-o, --only-matching 
     Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 
+0

ありがとうございました。ちょうど私が探しているもの –

2

あなただけのループをしたいような音:

for error in "${errors[@]}"; do 
    if grep -qE "(^|)$error(|\$)" file; then 
     # $error was found in the file 
    fi 
done 

これは、ラインの開始またはスペースが先行誤差と一致し、スペースまたは行の終わりが続きます。

私は、ストリング内のエラーのないマッチ出演への努力をしていますが、気にしないならば、あなたはこれにgrepコマンドを変更することができます:

grep -qF "$error" file 

場合、これが成功を返します。エラー文字列は、行のどこにでも発生します。

3

ここでは、一度だけgrepを呼び出す必要がある方法です:

$ grep -oFf <(printf "%s\n" "${errors[@]}") file 
1234 
9999 

-fオプションは、パターンを含むファイルを指定することです。私はパターンを1行に1つ「含む」ためにプロセス置換を使用します。

-Fオプションでプレーンテキストの一致が指定されています。「エラー」配列に正規表現が含まれていないと仮定します。

関連する問題