인쇄 대신 사용하는 몇 가지 예를 발견했습니다 awk
(예:1
print
$0
공간을 절약하기 위해 저는 보통 "1"을 사용합니다.. 그리고 이 웹사이트에서).
이것은 문서화되어 있거나 안전한 관행입니까, 아니면 일부 버전에서 깨질 수 있습니까?
여기 몇 가지 예가 있어요.
echo 'a-does-print-$0' | awk '"x"'
echo 'b-does-print-$0' | awk '$0'
echo 'c-does-print-$0' | awk '1'
echo 'd-does-print-$0' | awk '(1-2)'
echo 'd-does-print-$0' | awk '{$0="abc"}1'
echo 'nothing-prints' | awk '{$0="abc"}'
echo 'nothing-prints' | awk '$999'
echo 'nothing-prints' | awk '(1-1)'
echo 'nothing-prints' | awk '1-1'
echo 'nothing-prints' | awk '0'
echo 'nothing-prints' | awk 'unsetVar'
echo 'nothing-printw' | awk ''
echo 'crashes' | awk '-3.14159'
echo 'crashes' | awk '-2'
echo 'crashes' | awk '-1'
답변1
그래서... 프로그램의 형식은 awk
일련의 EXPRESSION { ACTION }
명령문입니다. 해당 ACTION
부분을 생략하면 모든 내용이 일치한다고 print
가정합니다 . EXPRESSION
그러면 모든 내용이 인쇄됩니다.
awk 1
귀하의 표현식( 1
)이 "true"로 평가되기 때문입니다(그리고 귀하는 아무것도 하지 않았습니다). 이는 모든 "x-does-print" 예제에 해당됩니다. 예제 입력이 주어지면 모두 0이 아니고, null이 아니고 EXPRESSION
no가 있기 때문입니다 ACTION
. 빈 입력 줄이 주어지면 $0
두 번째 예에서는 아무것도 출력되지 않습니다.
마찬가지로 첫 번째를 제외한 "인쇄 없음" 예제에 대한 표현식은 "false"(빈 문자열 또는 숫자 0)로 평가됩니다. 이 {$0="abc"}
예제는 다르게 작동합니다. 인쇄 지침이 없기 때문에 아무것도 인쇄하지 않습니다. 최소 999개의 필드를 포함하는 긴 입력 라인이 주어지면 두 번째 예( $999
)는 실제로 해당 라인을 인쇄합니다.
이것이 작동 방식의 기초입니다 awk
. 따라서 확실히 문서화되어 있으며 손상될 수 없습니다.
"충돌" 예제는 실제로 충돌하지 않는다는 점에 유의하세요. 방금 쉘 구문에 기본적인 실수를 했습니다. awk는 시작 부분의 인수를 -
명령줄 옵션으로 해석합니다. 인용해도 아무런 변화가 없습니다. 이와 같이 awk 음수를 전달하려면 awk 프로그램에 접두사를 붙여 --
awk에 옵션 처리를 중지해야 함을 나타내야 합니다.
echo 'crashes' | awk -- -3.14159
-3.14150
빈 문자열도 아니고 숫자 0도 아니기 때문에 "crash"를 인쇄합니다 .
답변2
~에서GNU awk
매뉴얼:
많은 프로그래밍 언어에는 "참"과 "거짓"의 개념에 대한 특별한 표현이 있습니다. 이러한 언어는 일반적으로 특수 상수 true 및 false를 사용하거나 해당 대문자를 사용합니다. 그러나 awk는 다릅니다. 이는 C에서 참과 거짓에 대한 매우 간단한 개념을 차용했습니다. awk에서는 0이 아닌 숫자 값이나 비어 있지 않은 문자열 값이 모두 true입니다. 다른 값(0 또는 빈 문자열 "")은 false입니다.
예, 이 사용법은 이식 가능하며 미래에도 사용할 수 있습니다.
참고로, 이것은 두 번째 예를 보여줍니다.
echo 'b-does-print-$0' | awk '$0'
인쇄되지 않음모든행, awk가 실제 문자열로 해석하는 행, 즉 빈 행 또는 숫자 0( 0
, 00
, 0.0e3
, -.0
, ...)만 포함하여 작성된 행입니다.