줄에 문자열이 포함되어 있으면 grep하는 방법은 무엇입니까?

줄에 문자열이 포함되어 있으면 grep하는 방법은 무엇입니까?

라는 설정 파일이 있습니다.학생

grade1 class1 11 student
grade1 class1 12 student
grade2 class1 21 student
grade2 class2 22 student
......

이제 나는테스트 파일파일을 읽는 학생입니다. 학년명과 학번을 입력하면 두 문자열이 포함된 행이 복사됩니다.학생 사본. 코드는 아래와 같이 표시됩니다.

echo Input gradename and studentnumber
read gradename
read studentnumber

if (input gradename and studnetnumber);
then
    echo "the line include them" >> student_copy

예를 들어:

if (input grade1 and 11);
then 
    echo grade1 class1 11 student >> student_copy

답변1

grep논리적이지 않음그리고작업(예: match patternA AND patternB)에서 가장 가까운 작업은 가능한 변형(예: grep -E 'patternA.*patternB|patternB.*patternA')과 일치하도록 더 긴 정규식을 구성하는 것입니다. 일치하는 패턴이 많으면 매우 서투르고 다루기 어려워질 수 있습니다.

원하는 것을 달성하는 가장 쉬운 방법은 스크립트 언어(예: awk또는 ) 를 perl대신 사용하는 것입니다 grep.

예를 들어, 다음 awk줄은 두 패턴이 모두 발생하는 모든 줄과 일치합니다.

awk '/patternA/ && /patternB/'

예를 들어 패턴 A는 포함하지만 패턴 B는 포함하지 않는 줄을 일치시키려는 경우 모든 패턴 일치를 되돌릴 수 있습니다(예:설마작업):

awk '/patternA/ && ! /patternB/'

참고: 간단한 방법은 grep patternA | grep patternB(또는 grep patternA | grep -v patternB)을 사용하는 것입니다.하다grep논리적 AND(또는 AND NOT)를 구현하지만 단일 awk또는 perl명령 대신 여러 명령을 실행해야 합니다 .

답변2

grade1합계가 있는 행을 찾고 싶다고 가정해 보겠습니다 11.

샘플 데이터(질문의 데이터와 다름) 및 검색 키:

$ cat student
grade1 class1 11 student
grade1 class1 111 student
grade11 class1 21 student
grade12 class2 22 student
$ grade=grade1
$ num=11

\<단어 가장자리와 일치하는 / 앵커 에 주의하면서 주어진 문자열을 직접 파악합니다 . \>이를 위해서는 다음과 같은 순서가 필요합니다.

$ grep "^$grade\>.*\<$num\>" student
grade1 class1 11 student

또는 -w완전한 단어를 일치시키려면.

$ < student grep -w "$grade" |grep -w "$num"
grade1 class1 11 student

위의 두 가지 모두 줄의 다른 곳에서 유사한 단어와 일치할 가능성이 높으므로 awk를 사용하여 이를 수행하고 적절한 필드만 비교하는 것이 더 나을 수 있습니다. 이는 필드가 공백으로 구분되어 있으므로 공백 자체를 포함할 수 없다고 가정합니다.

$ awk -vg=$grade -vn=$num '$1 == g && $3 == n' student
grade1 class1 11 student

공백이 포함된 필드가 필요한 경우 탭과 같은 다른 구분 기호를 사용하는 것이 좋습니다.

답변3

아래에서 이 명령을 실행하고 있습니다.

awk '{
if ($1!="grade1" || $3!=11)
print "###";
else
print $0;
}' student

출력은 다음과 같습니다

grade1 class1 11 student
###
###
###

이는 예상되는 출력입니다.

하지만 내가 달리면테스트 파일,코드는 아래와 같습니다:

read -p "Enter gradename: " gradename
read -p "Enter studentnumber: " studentnumber

echo "gradename = $gradename"
echo "studentnumber = $studentnumber"
awk '{
if ($1!="$gradename" || $3!=$studentnumber)
print "###";
else
print $0;
}' student > student2

cat student2

그러면 출력은 다음과 같습니다.

Enter gradename: grade1
Enter studentnumber: 11
gradename = grade1
studentnumber = 11
###
###
###
###

아주 이상한

답변4

나는 한때 awk의 라이너 아래에서 같은 것을 발견했고 잘 작동했습니다.

 for i  in `awk '{print $1}' student.txt| sed -r "s/\s+//g"| sed '/^$/d'| sort -u` ; do awk -v i="$i" '$1 ~ i && $3 == "11"{print $0}'  student.txt ; done

학생 번호 11을 상수로 확인했기 때문에 스크립트에서 $3==11을 언급했습니다.

"i"의 변수인 Grade1 및 Grade2

귀하의 요구 사항에 따라 학번을 변경할 수 있습니다. 필요에 따라 $3=="Freshman Number" 값을 변경합니다.

관련 정보