使用bash获取第一行的第二个单词

use*_*188 -3 python linux bash awk sed

我正在编写一个简单的脚本,需要使用bash命令来获取第一行的第二个单词.在下面的文件中,我想只打印出"主机",虽然我在这方面遇到了麻烦.

-bash-3.2$ cat filewithstuff
SERVERNAME      host
DOMAIN          all-nfs


-bash-3.2$ cat filewithstuff | awk  '{print $2}'
host
all-nfs
Run Code Online (Sandbox Code Playgroud)

我能够在linux主机上使用以下命令:

cat filewithstuff | sed -n 1p | awk "{print \$1}"
Run Code Online (Sandbox Code Playgroud)

虽然当我从Python脚本运行它时,我得到以下错误:

Executed: /bin/bash -l -c "cat filewithstuff | sed -n 1p | awk \"{print \\$1}\""

Aborting.

Fatal error: One or more hosts failed while executing task 'uninstallApp'

Aborting.
Run Code Online (Sandbox Code Playgroud)

似乎我的Python脚本不喜欢bash命令中的"\",有没有人知道我可以尝试的替代命令?

fed*_*qui 5

让awk完成所有工作:

command | awk 'NR==1 {print $2}'
Run Code Online (Sandbox Code Playgroud)

要么

awk 'NR==1 {print $2}' file
Run Code Online (Sandbox Code Playgroud)

NR代表记录数(此处的行数),$2代表第二个字段.总之,它告诉awk从第一行打印第二个字段.

如果您怀疑输出会非常大,请添加一个exit停止处理:{print $2; exit}.


Cha*_*ffy 5

仅使用内置函数(请参阅bash-hackers 页面readBashFAQ #1):

read -r _ secondword _ <file

echo "Second word is: $secondword"
Run Code Online (Sandbox Code Playgroud)

read...或者,从程序的输出中读取(由于BashFAQ #24 ,无法通过管道传输):

read -r _ secondword _ < <(yourcommand)
Run Code Online (Sandbox Code Playgroud)

这里的下划线是占位符:第一个下划线充当第一个单词的接收器,最后一个下划线充当第三个单词和任何剩余单词(如果存在)的接收器。


这比涉及外部命令(awkheadcut等)的任何操作都要快,因为它完全由 shell 本身执行。