在 bash 中 Grep 文件中的字符串

在 bash 中 Grep 文件中的字符串

当我 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"

  1. 使用 bash 迭代文件并不理想,但如果要使用它,则应该使用循环while read而不是for循环。
  2. grep -q用于抑制 grep 可能产生的任何输出
  3. printf '%d\n' "$((counter++))"用于保存一行
  4. 所有变量均已被引用。
  5. printf而不是echo在技术上更便携,但主要是一个偏好问题。

相关内容