ファイルから文字列を検索すると、一致が表示されます。ただし、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"
- Bashを使用してファイルを繰り返すことは理想的ではありませんが、それを使用するにはループの
while read
代わりにループを使用する必要がありますfor
。 grep -q
grepが生成できる出力を抑制するために使用されます。printf '%d\n' "$((counter++))"
行を保存するために使用されます。- すべての変数が参照されます。
printf
技術的には携帯性に優れていませんが、echo
ほとんどの方が好みの問題です。