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가 업데이트된 필드를 기반으로 행을 다시 작성하게 하고 행을 다시 작성하면 필드 주변의 공백 정보가 제거됩니다 . 그런 다음 후행 개행 문자도 제거합니다.
¹ $file
a로 시작하지 않는 경우 옵션 매개변수로 처리됩니다 -
. 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 -- x
cat
답변3
심지어 이것도 너무 길다. 그냥 해:
[m/n/g]awk NF=NF
NF
왼쪽의 첫 번째 따옴표는 셸이 =
등호로 어떤 작업도 수행하지 못하도록 하기 때문에 셸 수준에서는 따옴표가 필요하지 않습니다.