当我 grep 文件中的字符串时,它会给我一个匹配项。但是,当我在 bash 脚本中执行此操作时,它不起作用。
$ cat files_android.txt
000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072
001c738f74acbf19e3f31c09f6017de99bf3009a0b6f889740da0302ad172472
0047423956b09dd56a8b9c917d8f3028ad32ee01efdd501afa11b0777f4c184f
$ grep 000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 android.txt
G:\000d07dfe5016314c98b869c19c7f986b5db57db49ac76d16a5d2f5861a35072 - a variant of Android/Gappusin.C trojan
但是,使用以下从第一个参数读取字符串并在第二个参数中执行 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
在技术上更便携,但主要是一个偏好问题。