Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Bash 如何awk所有行而不是只看第一行_Bash_Shell - Fatal编程技术网

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的答案对于我的需求来说要简单得多。我很欣赏完成任务的解释和替代方法。