我正在编写一个简单的脚本,需要使用bash命令来获取第一行的第二个单词。在下面的文件中,我想只打印出“主机”,虽然我在这方面遇到了麻烦。
-bash-3.2$ cat filewithstuff
SERVERNAME host
DOMAIN all-nfs
-bash-3.2$ cat filewithstuff | awk '{print $2}'
host
all-nfs
我能够在linux主机上使用以下命令:
cat filewithstuff | sed -n 1p | awk "{print \$1}"
虽然当我从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.
似乎我的Python脚本不喜欢bash命令中的“\”,有没有人知道我可以尝试的替代命令?
答案 0 :(得分:5)
让awk完成所有工作:
command | awk 'NR==1 {print $2}'
或
awk 'NR==1 {print $2}' file
NR
代表记录数(此处的行数),$2
代表第二个字段。总之,它告诉awk从第一行打印第二个字段。
如果您怀疑输出会非常大,请添加exit
以停止处理:{print $2; exit}
。
答案 1 :(得分:3)
在BASH:
head -n1 filename | cut -d' ' -f2
在Python中:
with open(filename) as infile:
print(infile.readline().split(None, 2)[1])
答案 2 :(得分:3)
仅使用内置版本(请参阅the bash-hackers page on read
或BashFAQ #1参考):
read -r _ secondword _ <file
echo "Second word is: $secondword"
...或者,从程序的输出中读取(由于BashFAQ #24,无法输入read
):
read -r _ secondword _ < <(yourcommand)
这里的下划线是占位符:第一个用作第一个单词的接收器,最后一个用作第三个单词的接收器,如果它们存在则用作剩余的接收器。
这比涉及外部命令(awk
,head
,cut
等)的任何内容都快,因为它完全由shell本身执行。