큰 따옴표를 사용하여 awk의 동작 문을 묶는 이유는 작은 따옴표를 사용하여 묶는 것과 다른 결과를 생성하는 이유는 무엇입니까?


8

작은 따옴표를 사용하여 awk의 작업 설명을 묶으면 예상대로 작동합니다.

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {'print $2'}
linux-headers-3.13.0-27
linux-headers-3.13.0-27-generic
linux-headers-3.14.4-031404
linux-headers-3.14.4-031404-generic
linux-headers-generic
linux-image-3.13.0-27-generic
linux-image-3.14.4-031404-generic
linux-image-extra-3.13.0-27-generic
linux-image-generic
linux-libc-dev:i386
linux-sound-base

그러나 큰 따옴표를 사용하여 묶으면 특정 열 / 필드 대신 전체 줄을 인쇄합니다.

$ dpkg -l | grep "linux\-[a-z]*\-" | awk {"print $2"}
ii  linux-headers-3.13.0-27                    3.13.0-27.50                                           all          Header files related to Linux kernel version 3.13.0
ii  linux-headers-3.13.0-27-generic            3.13.0-27.50                                           i386         Linux kernel headers for version 3.13.0 on 32 bit x86 SMP
ii  linux-headers-3.14.4-031404                3.14.4-031404.201405130853                             all          Header files related to Linux kernel version 3.14.4
ii  linux-headers-3.14.4-031404-generic        3.14.4-031404.201405130853                             i386         Linux kernel headers for version 3.14.4 on 32 bit x86 SMP
ii  linux-headers-generic                      3.13.0.27.33                                           i386         Generic Linux kernel headers
ii  linux-image-3.13.0-27-generic              3.13.0-27.50                                           i386         Linux kernel image for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-3.14.4-031404-generic          3.14.4-031404.201405130853                             i386         Linux kernel image for version 3.14.4 on 32 bit x86 SMP
ii  linux-image-extra-3.13.0-27-generic        3.13.0-27.50                                           i386         Linux kernel extra modules for version 3.13.0 on 32 bit x86 SMP
ii  linux-image-generic                        3.13.0.27.33                                           i386         Generic Linux kernel image
ii  linux-libc-dev:i386                        3.13.0-27.50                                           i386         Linux Kernel Headers for development
ii  linux-sound-base                           1.0.25+dfsg-0ubuntu4                                   all          base package for ALSA and OSS sound systems

왜 그래야만하지? 큰 따옴표를 사용하여 awk의 동작 문을 묶는 이유는 작은 따옴표를 사용하여 묶는 것과 다른 결과를 생성하는 이유는 무엇입니까? 큰 따옴표를 사용하여 묶는 것이 작은 따옴표를 사용하는 것처럼 작동하도록 할 수 있습니까?


중괄호 밖에서 작은 따옴표를 사용하십시오.
Avinash Raj

@AvinashRaj 구문 오류가 발생하면의 모든 조치 명령문이 내에 awk있어야합니다 { ... }.
Aditya

구문 오류가 발생한다고 누가 말했습니까? Awk sysntax는 다음과 같습니다 awk 'condition1{action1} condition2 {action2}'. 우리가 이와 같이 awk 명령을 주면 awk '{print $1}'주어진 조건이 없음을 의미합니다.
Avinash Raj

나는 당신의 명령 awk {'print $2'}이 잘못되었다고 말하지 않았습니다 . 나는 중괄호 안에 작은 따옴표를 피하는 것이 더 좋을 것이라고 말했다.
Avinash Raj

@AvinashRaj 오 .. 다른 의미가 있다고 생각했습니다.
Aditya

답변:


6

큰 따옴표를 사용하면 $2이전에 셸로 대체 awk가 호출됩니다. 으로는 $2일반적으로 빈 실행

awk {"print $2"}

달리기와 같다

awk {"print "}

사용하다

awk {"print \$2"}

큰 따옴표를 사용하려면


나는 수행 쉘 확장은 때와 매뉴얼을보고 . 작은 따옴표 나 큰 따옴표에 대해서는 언급하지 않습니다. 작은 따옴표의 경우 확장이 수행되지 않는 이유는 무엇입니까? 그리고 bash는 어디에서 $2확장 되었습니까? (나는 물건을 배우려고 노력하고 있기 때문에, 무슨 일이 일어나고 있는지 이해하고 싶습니다) :)
Aditya

아 .. 이것은 작은 따옴표와 큰 따옴표의 차이점을 설명합니다. 분명하다. 이제 배쉬는 어디서 왔을 까 $2?
Aditya

커맨드 라인에서 작업하는 경우 $2일반적으로 빈 환경 변수입니다
Florian Diesch

bash에서 변수를 정의 할 필요가 없다는 것을 알지 못했습니다. bash가 변수를 찾지 못하면 변수가 자동으로 비워집니다. 서버 결함에 대한이 답변은이 를 해결합니다.
Aditya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.