나는 이것을 가지고있다:
if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
awk -v var="$2" '{print $2}' something.txt
fi
-c abc
내가 원하는 것은 some.txt에 포함된 줄을 표시 하는 명령을 사용하는 것입니다 abc
.
답변1
grep을 사용하세요:
grep abc something.txt
또한$2
껍데기(아시다시피) 두 번째 주장을 언급하지만, awk
다릅니다. 귀하의 질문은 이에 대한 오해를 나타내는 것 같아서 명확히하겠습니다.
쉘은 $
변수 값을 인용해야 합니다. 따라서 를 myvar
작성하여 이름이 지정된 변수를 참조합니다 $myvar
.
awk
명명된 변수를 참조 하려면 myvar
해당 이름 - 을 사용하면 됩니다 myvar
. myvar 문자가 포함된 리터럴 문자열을 참조하려면 를 입력합니다 "myvar"
.
수단$
으로awk
대지구체적인숫자. so는 $2
파일의 현재 줄의 두 번째 필드를 나타냅니다. 또는 을 설정하면 myvar = "4"
다음 $myvar
을 참조합니다.네번째파일 필드.
주어진 패턴과 일치하는 파일의 모든 행을 인쇄하려면 다음을 사용하십시오. grep
이것이 바로 설계된 것입니다.
답변2
면책조항으로 awk는 작업에 적합한 도구가 아닙니다. 실제 사용 사례가 더 복잡하고 합리적이라고 가정하므로 이를 정리해주셔서 감사합니다!
이 특정 문제는 변수 "확장"과 bash에서 awk로 인수 전달이라는 두 가지 문제로 귀결되는 것 같습니다.
awk 변수와$
awk 변수 앞에 접두사를 붙이면 $
즉시 필드에 대한 참조가 됩니다. 쉘, PHP 또는 Perl에 익숙하다면 이것이 이상할 수 있습니다.
그래서 이런 입력이
thing alive
cat yes
lamp no
파이프를 통과 awk 'BEGIN{alive=2}{print $alive}'
하면
alive
yes
no
그리고 awk 'BEGIN{alive=2}{print alive}'
생산할 것이다
2
2
2
awk와 bash를 혼합하면 상황이 조금 이상해집니다. 이것이 첫 번째 부분에 도움이 되기를 바랍니다.
bash에서 awk로 매개변수 전달
awk를 사용하기로 결정하고 bash 명령에 awk 변수를 설정하는 경우 아마도 다음을 찾고 있을 것입니다.
if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
awk -v var="$2" 'index($0, var)' something.txt
fi
참고: 는 index($0, var)
약어입니다.if (index($0, var)) { print $0 }
물론 이것은 "좋은" 해결책은 아니지만 awk가 작업에 잘못된 도구라는 문제로 돌아갑니다. 완전한 awk 솔루션을 보려면 다음을 확인하세요.ARGV
그리고ARGC