Awk에서 쉘 변수 사용하기

Awk에서 쉘 변수 사용하기

나는 이것을 가지고있다:

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

관련 정보