순수 고양이 대신 이 명령줄(/usr/bin/awk '{$1=$1};1')의 이점은 무엇입니까?

순수 고양이 대신 이 명령줄(/usr/bin/awk '{$1=$1};1')의 이점은 무엇입니까?

AWS를 읽고 있어요eic_harvest_hostkeys스크립트, 다음 줄을 이해할 수 없습니다.

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")

awk의 장점은 무엇인가요? 더 좋지 않나요 key=$(/bin/cat "${file}")?

답변1

key=$(/bin/cat "${file}")key줄 바꿈 없이 파일 내용으로 설정합니다 . (널 바이트가 아닌 텍스트 파일이라고 가정합니다.)

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")가로 공백 정규화: 각 줄의 시작과 끝에서 공백과 탭을 제거하고 내부 공백과 탭 순서를 단일 공백으로 압축합니다. $1=$1작동하지 않는 것처럼 보이지만 실제로는 awk가 업데이트된 필드를 기반으로 행을 다시 작성하게 하고 행을 다시 작성하면 필드 주변의 공백 정보가 제거됩니다 . 그런 다음 후행 개행 문자도 제거합니다.


¹ $filea로 시작하지 않는 경우 옵션 매개변수로 처리됩니다 -. cat사용하는 것이 더 나을 것입니다 key=$(cat < "$file")( key=$(cat -- "$file")또한 개선이 되겠지만 file='-'여전히 문제입니다).

답변2

입력 행을 표준 형식으로 강제 $1로 다시 작성 하는 할당입니다 .awk

{ echo 'one  two  three'; echo '  indented with trailing  '; } | cat
one  two  three
  indented with trailing

{ echo 'one  two  three'; echo '  indented with trailing  '; } | awk '{$1=$1}; 1'
one two three
indented with trailing

또한 를 사용하면 file=-x대시로 시작하는 파일 이름을 참조하는 경우 key=$(<"$file")올바르게 작동 하지만 많은 (모두?) 구현의 경우 key=$(cat "$file")와 마찬가지로 오류가 발생합니다 .cat: unknown option -- xcat

답변3

심지어 이것도 너무 길다. 그냥 해:

[m/n/g]awk NF=NF

NF왼쪽의 첫 번째 따옴표는 셸이 =등호로 어떤 작업도 수행하지 못하도록 하기 때문에 셸 수준에서는 따옴표가 필요하지 않습니다.

관련 정보