Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用grep和awk的BASH FOR循环_Bash_For Loop_Awk_Grep - Fatal编程技术网

使用grep和awk的BASH FOR循环

使用grep和awk的BASH FOR循环,bash,for-loop,awk,grep,Bash,For Loop,Awk,Grep,我正试图让这个脚本进入cat一个文件,grep每行877,对于找到的每一行,打印第一列,这是一个IP,并将其存储在主机中。它每次都卡在awk上。我运行sh-xsome.sh查看它挂起的位置。我应该打印到文件而不是列表吗?为什么它会卡在awk上 hosts=() FILENAME=/home/somethin/.hosts.conf ips=`cat $FILENAME | grep -v '877'` for line in $ips; do hosts=$(`awk '{pri

我正试图让这个脚本进入
cat
一个文件,
grep
每行
877
,对于找到的每一行,打印第一列,这是一个IP,并将其存储在主机中。它每次都卡在awk上。我运行
sh-xsome.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

所有这些都可以使用awk完成:

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

echo "${hosts[@]}"

尝试
echo$line | awk'{print$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 skript的快捷方式,以后更容易扩展。因此,有一个折衷办法,而且您开始时的方式没有任何错误。…

&要回答您的问题,“为什么它会卡在awk上?”:您没有向awk命令提供任何输入<代码>awk'{print$1}'谢谢@anubhava的回复。但是我只得到第一行的第一列。+FILENAME=/home/occam/.blc-hosts.conf+hosts=($(awk'/332/{print$1}'$FILENAME))++awk'/332/{print$1}'/home/occam/.blc-hosts.conf+echo您想要包含332的行还是不包含332的行?包含332的行;应该有大约32行ip地址。在这种情况下,请尝试此命令,并让我知道您在输出中获得了多少条记录:
awk'/332/{print$1}'/home/occam/.blc hosts.conf
?无输出:+awk'/332/{print$1}'/home/occam/.blc-hosts.conf