오늘 awk에 어려움을 겪고 있습니다. 내가 이것을 시도하면 :
df|awk '{print $2; $some=$2; print $some}'
예상대로 작동하고 디스크 크기가 두 배로 표시되지만 그렇게 하면 다음과 같습니다.
df|awk '{$some=$2; print $some}'
빈 줄만 나타납니다. 왜 이런 일이 발생합니까? 제가 이해한 내용에 문제가 있을 수 있지만 왜 후속 필드가 작동하려면 한 필드를 사용해야 합니까? 나는 또한 이것을 시도했다:
df|awk '{print "hello"; $some=$2; print $some}'
나는 각각 줄 바꿈으로 구분된 여러 개의 "hello"를 얻습니다. $some=$2가 어디에 없나요?
내 df
명령 출력:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 38448788 32098732 4396932 88% /
udev 1914564 4 1914560 1% /dev
tmpfs 768744 984 767760 1% /run
답변1
$
앞에 - 기호를 사용 하면 안 됩니다 some
. 첫 번째 명령이 $2
인쇄된 다음 이후 $some=$2
로 변환되어 (일부 구현 에서는 모두가 아닌 로 변환되고 오류 메시지가 표시됨), Record()를 for로 바꾼 다음 인쇄합니다. 이는 다음과 같다는 것을 의미합니다.$0=$2
some
awk
some
""
0
$0
$2
$some
$0
df|awk '{print $2; $0=$2; print $0}'
그리고
df|awk '{$0=$2; print $0}'
당신이 하고 싶은 일은 다음과 같습니다:
df|awk '{print $2; some=$2; print some}'
답변2
예상했던 결과를 얻었습니다. 첫 번째 명령은 각 항목을 두 번 인쇄합니다. 두 번째 명령은 이를 한 번 인쇄합니다.
이는 다소 색다른 방식입니다. "some"은 정의되지 않았기 때문에 기본값은 0입니다. 따라서 $some은 $0이며 이는 전체 줄을 나타냅니다. 따라서 기본적으로 $2를 사용할 때 해당 줄을 $2에 있는 내용으로 바꿉니다.$some=$2
이 결과와 비교해보세요:
johan@computer:~$ df|awk '{$some=$2; print}'
1K-blocks
30827524
4041028
1621692
5120
4054228
102400
4054228
60555340
209548784
출력이나 다른 결과가 나오지 않는 이유: 적어도 일부 시스템에서는 초기화되지 않은 변수를 사용하는 동작이 정의되지 않을 수 있다고 예상합니다.
Solaris에서는 /usr/xpg4/bin/awk에 설치된 POSIX 호환 버전뿐 아니라 "표준" awk에도 액세스할 수 있습니다. 이 두 가지 모두에 대해 동일한 결과를 생성합니다.
앞에 print "hello"를 추가하는지, 마지막 명령을 (print $some 대신) "print"로 바꾸는지 여부에 따라 다른 결과가 생성됩니다.
그러나 그들은 모두 공백 대신 뭔가를 인쇄합니다. 저는 아직 이 효과를 재현하는 버전을 찾지 못했습니다.
그래서 저는 이것이 초기화되지 않은 변수를 사용하여 발생하는 일종의 정의되지 않은 동작일 것이라고 예상했습니다.가능한 열 범위의 끝을 훨씬 넘어서는 열에 값을 할당하고 있습니다.입력 스트림에서. $some은 "some" 값으로 식별되는 열을 나타냅니다.
변수로는 "some"만 사용해야 합니다.
df | awk '{print "hello";some=$2; print some}'
답변3
내 생각에 이런 일이 일어나는 이유는 Ubuntu가 표준 GNU 이식을 사용하지 않고 표준 Unix에서 작동하는 많은 코드를 깨뜨리는 mawk라는 다른 것을 사용하기 때문이라고 생각합니다.
이것을 참고하세요협회비슷한 토론을 해보세요.