这个命令行(/usr/bin/awk '{$1=$1};1')代替纯cat有什么好处

K-a*_*la- 7 scripting bash awk cat aws

我正在阅读 AWSeic_harvest_hostkeys脚本,但不明白这一行:

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")
Run Code Online (Sandbox Code Playgroud)

awk 有什么好处?不是key=$(/bin/cat "${file}")更好吗?

Gil*_*il' 17

key=$(/bin/cat "${file}")key为文件\xc2\xb9 的内容,不带尾随换行符。(我假设一个文本文件,没有空字节。)

\n

key=$(/usr/bin/awk '{$1=$1};1' < "${file}")标准化水平空白:它删除每行开头和结尾的空格和制表符,并将空格和制表符的内部序列压缩为单个空格。尽管$1=$1看起来像无操作,但它实际上会导致 awk 根据更新的字段重建行,并且重建行会删除字段周围空白的信息。然后它还会删除尾随的换行符。

\n
\n

\xc2\xb9 假设$file不以 a 开头-,这会导致cat将其视为选项参数。使用key=$(cat < "$file")会更好(key=$(cat -- "$file")也会是一种改进,但是file='-'仍然是一个问题)。

\n


roa*_*ima 12

$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
Run Code Online (Sandbox Code Playgroud)

此外,当file=-x,即它引用以破折号开头的文件名时, usingkey=$(<"$file")将正常工作,而key=$(cat "$file")会产生错误,例如cat: unknown option -- x许多(全部?) 的实现cat

  • 请注意,您省略的“{$1=$1}”和“1”之间的“;”(与OP相反)在标准“awk”语法中是必需的(换行符也可以),但实际上,它是据我所知,在任何“awk”实现中都不需要(尽管如此,gawk 的维护者仍然反对在标准中放松这一要求)。 (6认同)