Bash 如何awk所有行而不是只看第一行
我正在尝试编写一个脚本,允许您输入计算机名,然后让您知道主机是否在本地网络上。以下是我所拥有的:Bash 如何awk所有行而不是只看第一行,bash,shell,Bash,Shell,我正在尝试编写一个脚本,允许您输入计算机名,然后让您知道主机是否在本地网络上。以下是我所拥有的: #!/bin/bash echo "Please enter the host you would like to ping:" read -r host output=$(ruptime | awk '{print $1}') if [ "$output" == "$host" ]; then echo "$host is up" else ec
#!/bin/bash
echo "Please enter the host you would like to ping:"
read -r host
output=$(ruptime | awk '{print $1}')
if [ "$output" == "$host" ];
then
echo "$host is up"
else
echo "$host is down"
fi
当我输入我的机器名“ubuntu”时,这就起作用了,因为我是局域网上唯一的一个,awk语句输出“ubuntu”
例如,如果我跑步:
#!/bin/bash
echo "Please enter the host you would like to ping:"
read -r host
output=$(cat /etc/hosts | awk '{print $1}')
if [ "$output" == "$host" ];
then
echo "$host is up"
else
echo "$host is down"
fi
输出为两行:localhost和ubuntu。如果我运行脚本并输入其中任何一个,它会说找不到
我认为awk只是在寻找第一行中的值。如何让脚本检查awk输出的每一行,然后将其与输入的内容进行比较?
提前谢谢 您正在为所有名称设置
$output
。您不是在检查$host
是否是其中一个,而是在检查$host
是否同时等于所有这些
grep
是一种更好的方法
if ruptime | grep -q -w "$host"
then echo "$host is up"
else echo "$host is down"
fi
您正在为所有名称设置
$output
。您不是在检查$host
是否是其中一个,而是在检查$host
是否同时等于所有这些
grep
是一种更好的方法
if ruptime | grep -q -w "$host"
then echo "$host is up"
else echo "$host is down"
fi
假设您的目标是查看给定名称是否位于
ruptime
输出的第一列中,这可能如下所示:
#!/usr/bin/env bash
hostname="target"
while read -r hostname _; do
[[ $hostname = "$target" ]] && { echo "$target is up"; break; }
done < <(ruptime)
#/usr/bin/env bash
hostname=“目标”
当读取-r主机名时;做
[[$hostname=“$target”]&&&{echo“$target已启动”中断;}
完成<假设您的目标是查看给定名称是否位于ruptime
输出的第一列中,这可能如下所示:
#!/usr/bin/env bash
hostname="target"
while read -r hostname _; do
[[ $hostname = "$target" ]] && { echo "$target is up"; break; }
done < <(ruptime)
#/usr/bin/env bash
hostname=“目标”
当读取-r主机名时;做
[[$hostname=“$target”]&&&{echo“$target已启动”中断;}
doneoutput=$(cat/etc/hosts | awk'{print$1}')
将文件中每行的第一列放入$output
中的单个字符串中。当然,此字符串不等于任何单个主机名。$output
包含所有主机名。您将一个名称与所有名称进行比较,它们并不相等。顺便说一句,=
不保证在[
跨shell;更好的习惯是使用=
,这是中指定的唯一字符串比较运算符。感谢您的提示和建议!我没想到awk会打印由条件{ACTION}组成的每个lineawk程序的第一列
成对。如果省略该条件,则默认为对每行运行该操作。如果省略该操作,则默认为按原样打印整行。因此,可以设置一个条件,告知awk仅对某些行执行其操作,但默认为所有行。awk始终查看其输入的所有行。output=$(cat/etc/hosts | awk'{print$1}')
将文件中每行的第一列放入$output
中的单个字符串中。当然,此字符串不等于任何单个主机名。$output
包含所有主机名。您将一个名称与所有主机名进行比较,它们并不相等。顺便说一句,=
不保证在中工作[
跨shell;更好的习惯是使用=
,这是中指定的唯一字符串比较运算符。感谢您的提示和建议!我没想到awk会打印由条件{ACTION}组成的每个lineawk程序的第一列
pairs。如果您省略了条件,则默认为每行运行操作。如果您省略了操作,则默认为按原样打印整行。因此,您可以设置一个条件,告知awk仅对某些行执行操作,但默认为所有行。非常感谢,这非常有效,但我发现Barwar的答案是正确的对于我的需求来说要简单得多。我很欣赏完成任务的解释和替代方法。非常感谢,这很有效,但我发现Barwar的答案对于我的需求来说要简单得多。我很欣赏完成任务的解释和替代方法。