我正在尝试将此脚本发送到cat
文件,grep
每行877
,并找到每一行,打印第一列是IP并存储它在主持人。它每次都卡在awk
上。我运行sh -x some.sh
以查看挂断的位置。我应该打印到文件而不是列表吗?为什么它会卡在awk
上?
hosts=()
FILENAME=/home/somethin/.hosts.conf
ips=`cat $FILENAME | grep -v '877'`
for line in $ips; do
hosts=$(`awk '{print $1}'`)
done
echo $hosts
答案 0 :(得分:9)
这一切都可以使用awk完成:
hosts=( $(awk '/877/{print $1}' $FILENAME) )
echo "${hosts[@]}"
答案 1 :(得分:1)
根据原始代码和更正的版本/代码审核来回答此主题:
#ideally use variable names that do not exist as a command
hosts=()
FILENAME="/home/somethin/.hosts.conf"
ips=`cat $FILENAME | grep '322'`
for line in $ips; do
hosts+=("`echo $line | awk '{print $1}'`")
#alternative for shells not supporting the += operator:
#hosts=("${hosts[@]}" "`echo $line | awk '{print $1}'`")
done
echo ${hosts[@]}
有几个问题需要指出,这会让您觉得您的脚本“卡在了awk上”
hosts=$(`awk '{print $1}'`)
-v
选择逆,即不匹配。$(
awk'{print $ 1}')
。echo variablename
只会打印bash数组的第一个元素注意:可以使用awk
和sed
执行很多操作,但两者都可以作为更详细的快捷方式,也可以是更好的结构化bash / shell skripts,以后更容易扩展。所以有一个权衡,你开始的方式没有错......
答案 2 :(得分:0)
尝试echo $line | awk '{print $1}'