使用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未提供任何输入
将只打印bash数组的第一个元素echo variablename
注意:使用
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