使用grep和awk的BASH FOR循环

时间:2013-06-24 13:59:45

标签: bash for-loop awk grep

我正在尝试将此脚本发送到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

3 个答案:

答案 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}'`)
  • 重新分配主持人
  • 有意或无意,您正在使用grep标志-v选择逆,即不匹配
  • 您正在使用美元和反引号表示法执行嵌套命令替换,输入不包含命令:$( awk'{print $ 1}')
  • awk没有任何输入
  • echo variablename只会打印bash数组的第一个元素

注意:可以使用awksed执行很多操作,但两者都可以作为更详细的快捷方式,也可以是更好的结构化bash / shell skripts,以后更容易扩展。所以有一个权衡,你开始的方式没有错......

答案 2 :(得分:0)

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