bash ファイルの Grep 文字列

bash ファイルの Grep 文字列

ファイルから文字列を検索すると、一致が表示されます。ただし、bashスクリプトでこれを行うと機能しません。

$ cat files_android.txt
000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072
001c738f74acbf19e3f31c09f6017de99bf3009a0b6f889740da0302ad172472
0047423956b09dd56a8b9c917d8f3028ad32ee01efdd501afa11b0777f4c184f
$ grep  000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 android.txt
G:\000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 - a variant of Android/Gappusin.C trojan

ただし、最初のパラメータから文字列を読み込み、2番目のパラメータに対してgrepを実行する次のスクリプトを使用すると、一致は報告されません。

$ cat script.sh
#!/bin/bash
FILE1=$1
FILE2=$2
counter=0
for line in $(cat $FILE1); do
  echo "$line"
  if grep $line $FILE2; then
    counter=$((counter+1))
    echo "$counter"
  fi
done
echo "counter=$counter"
$ ./script.sh files_android.txt android.txt
000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072
001c738f74acbf19e3f31c09f6017de99bf3009a0b6f889740da0302ad172472
0047423956b09dd56a8b9c917d8f3028ad32ee01efdd501afa11b0777f4c184f
counter=0

これは何の問題ですか?

【書き直す】

Stephen Harrisのおかげで、根本的な原因はファイルがフォーマットdosで保存されることです。だからdos2unix変換で問題を解決しました。

ベストアンサー1

コードに正確に問題があるかどうかはわかりませんが、引用されていない変数によって、意図しない方法で何かが拡張される可能性があります。

次のように改善しました。

#!/bin/bash
FILE1=$1
FILE2=$2
counter=0

while IFS= read -r line; do
    printf '%s\n' "$line"
    if grep -q "$line" "$FILE2"; then
        printf '%d\n' "$((counter++))"
    fi
done <"$FILE1"
printf 'counter=%d\n' "$counter"

  1. Bashを使用してファイルを繰り返すことは理想的ではありませんが、それを使用するにはループのwhile read代わりにループを使用する必要がありますfor
  2. grep -qgrepが生成できる出力を抑制するために使用されます。
  3. printf '%d\n' "$((counter++))"行を保存するために使用されます。
  4. すべての変数が参照されます。
  5. printf技術的には携帯性に優れていませんが、echoほとんどの方が好みの問題です。

おすすめ記事