如何在BASH中打印整行

3

我是一名新手bash脚本程序员,一直在尝试打印整行内容,但始终找不到可行的方法。

这是我的代码:

#!/bin/bash
MOTD=`cat /etc/motd | awk '{print $1}'`
if [ "$MOTD" = "WARNING" ]
then
    echo "Audit Criteria: Warning banner exist."
    echo "Vulnerability: No."
    echo "Details: $MOTD "
else
    echo "Audit Criteria: Warning banners does not exist."
    echo "Vulnerability: Yes."
    echo "Details: $MOTD "
fi

我的输出如下:

Audit Criteria: Warning banner exist.
Vulnerability: No.
Details: WARNING:

与其显示“警告:仅限授权使用,所有活动都可能被监视和报告”,只有“警告”出现在详细信息中:

我认为问题在于

MOTD=`cat /etc/motd | awk '{print $1}'` 

并且

if [ "$MOTD" = "WARNING" ] 部分,我尝试了 {print$0},但仍无法使其正常工作。


这是预期的,因为您只将消息的第一个单词分配给变量MOTD - Tom Fenech
1
一些小问题。不应该在具有读取数据功能的程序(如awk)中使用 cat。应避免使用旧式过时的反引号,而是使用括号。因此将 MOTS 行更改为:MOTD=$(awk '{print $1}' /etc/motd) - Jotne
1
@Skynet,请注意在已经提交之前进行编辑时要小心。您的编辑撤销了我对问题所做的许多改进。 - Tom Fenech
好的,抱歉我没有检查到另一个编辑正在进行中@TomFenech。 - Arnab Nandy
3个回答

2

我猜您想要获取/etc/motd的第一行,而不是第一个单词。如果是这样,请使用以下命令:

MOTD=$(head -1 /etc/motd)

然后使用字符串比较函数进行比较

if [[ $MOTD == WARNING* ]; then

您可以查看在bash中检查字符串是否包含特定子字符串,了解更多关于在bash中检查字符串是否包含特定子字符串的信息。

2
然后测试将是[[ $MOTD == WARNING* ]] - glenn jackman
@Jotne,为了效率,您需要使用awk 'NR==1 {print; exit}' - glenn jackman
只是想补充一下,OP的命令无法工作的原因是他们只是使用了$1打印了第一个字段。 - user3442743
@glennjackman 或者只需使用 awk '{print;exit}'awk '1;{exit}' - user3442743
1
IFS= read -r MOTD < /etc/motd 是获取第一行最有效的方式。 - chepner
显示剩余3条评论

2
也许用awk做整个事情会更简单:
awk 'NR==1{
    if($1=="WARNING") {
        print "Audit Criteria: Warning banner exists."
        print "Vulnerability: No."
    }
    else { 
        print "Audit Criteria: Warning banner does not exist."
        print "Vulnerability: Yes."
    }
    print "Details: " $0
    exit
}' /etc/motd

条件NR==1和块末尾的exit表示仅处理文件的第一行。

上面的代码与您的bash脚本最相似,但您可以使用变量使其更短:

awk 'NR==1{if($1=="WARNING"){b="exists";v="No"}else{b="does not exist";v="Yes"}
printf "Audit Criteria: Warning banner %s.\nVulnerability: %s.\nDetails: %s\n",b,v,$0
exit}' /etc/motd

请注意,/etc/motd通常包含很多行。因此,您可能希望以“exit”结束所有内容,以避免大量输出。 - fedorqui
1
@fedorqui,我之前不知道这个,谢谢你告诉我。我已经编辑了代码,只处理第一行,然后退出。 - Tom Fenech
是的,motd代表“每日消息”,用于显示许多内容(或没有)。它通常与/etc/issue相关联,可以包含安全信息、服务器名称等。 - fedorqui
1
谢谢提供信息。我以为它是指《当日比赛》(http://www.bbc.co.uk/programmes/b007t9y1) ;) 顺便说一下,information是不可数的(我们不说“informations”) :) - Tom Fenech
哎呀,又一个MOTD的同义词:我的今日错误!甚至是今日拼写错误 :) - fedorqui

0

您仅在使用变量MOTD,其值仅为WARNING。

#!/bin/bash

MOTD=`cat /etc/motd | awk '{print $1}'`    
if [ "$MOTD" = "WARNING" ]    
then
    echo "Audit Criteria: Warning banner exist."        
    echo "Vulnerability: No."       
    echo "Details: `cat /etc/motd` "    
else        
    echo "Audit Criteria: Warning banners does not exist."      
    echo "Vulnerability: Yes."      
    echo "Details: `cat /etc/motd`"    
fi

或者,如果您在/etc/motd中有多行内容,并且您只需要打印一行,则可以这样做。

#!/bin/bash

MOTDL=`grep WARNING /etc/motd`
MOTD=`cat /etc/motd | awk '{print $1}'`    
if [ "$MOTD" = "WARNING" ]    
then
    echo "Audit Criteria: Warning banner exist."        
    echo "Vulnerability: No."       
    echo "Details: $MOTDL "    
else        
    echo "Audit Criteria: Warning banners does not exist."      
    echo "Vulnerability: Yes."      
    echo "Details: $MOTDL"    
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接