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

그러나 첫 번째 매개변수에서 문자열을 읽고 두 번째 매개변수에 대해 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대부분 선호도의 문제입니다.

관련 정보