라는 설정 파일이 있습니다.학생
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" 값을 변경합니다.