/home/mytest/data
파일의 각 줄에서 특정 패턴을 찾으려고 노력 중이며 1.txt
, 일치하는 항목이 발견되면 전체 줄을 2.txt
파일에 복사합니다. 그러나 2.txt
파일에 설정된 결과는 예상한 결과가 아닙니다.
암호
i=/home/mytest/data
IFS=',' read -ra ADDR <<< "$File_Name"
Input=1.txt
for i in "${ADDR[@]}";
do
j=0
while IFS= read -r line;
do
j=$((j+1))
Exists=$(echo $line | grep -w "$i" )
if [[ ! -z "$Exists" ]]; then
cp=$(echo $line >> 2.txt)
fi
done <"$Input"
예상 결과 - 2.txt
# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
실제 결과 - 2.txt
# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---
grep 버전: GNU grep 2.20
답변1
문제는 (비표준) 옵션을 사용하면 패턴 앞뒤에 단어 경계가 필요하다는 것 -w
입니다 . grep
"단어 경계"는 단어와 비단어 사이의 전환입니다. "단어"는 단어 문자(예 a
: 등) 를 포함하는 문자열이고 , 비단어는 b
공백, 등의 문자를 포함하는 문자열 /
입니다 .?
/
"단어 문자"가 아니기 때문에 단어 경계가 앞에 올 수 없습니다.전에단어 문자로). 따라서 일부 버전은 grep
데이터의 문자열과 일치할 수 없습니다. 다른 버전회의경쟁할 수 있습니다.
바로 앞에 있는 줄의 경로와 일치시키려는 것 같고 경로가 # file:
같은 줄에서 바로 앞에 있다는 것을 알고 있으므로 다음 문자열을 주어진 경로에 대한 구분 기호로 사용할 수 있습니다. # owner:
querypath=/home/mytest/data
grep -F "# file: $querypath # owner:" 1.txt >2.txt