3

我正在尝试将此脚本保存到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
4

3 回答 3

9

这一切都可以使用 awk 完成:

hosts=( $(awk '/877/{print $1}' $FILENAME) )

echo "${hosts[@]}"
于 2013-06-24T14:02:31.947 回答
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}'`)
  • 有意与否,您选择的是相反的,即与 grep 标志不匹配-v
  • 您正在执行以美元和反引号表示的嵌套命令替换,输入不包含命令:$(awk '{print $1}' )
  • awk 没有给出任何输入
  • echo variablename只会打印 bash 数组的第一个元素

awk注意:和可以执行很多操作sed,但两者都旨在作为更详细但结构更好的 bash/shell 脚本的快捷方式,这些脚本在以后更容易扩展。所以有一个权衡,你开始的方式没有错......

于 2013-09-30T19:33:50.463 回答
0

尝试echo $line | awk '{print $1}'

于 2013-06-24T14:15:37.307 回答