【问题标题】:Linux redirection help needed需要 Linux 重定向帮助
【发布时间】:2014-03-01 04:53:05
【问题描述】:

我正在尝试创建一个脚本,该脚本在运行时将访问 /var/log/secure 文件并报告当天发生了多少次失败尝试,并将输出附加到名为 failed 的文件中:

日期:02/15/14 时间:10:30 失败尝试次数:8

并且应该使用文件重定向在脚本内完成输出,以便标准输出进入 failed.log 并且标准错误进入 error.log 文件。

我的代码(test.sh)是这样的:

#!/bin/bash
 for i in $(date)

 do
 mdy=$($i "+%m/%d/%Y)
 md=$($i "+%m %d")
 tme=$($i "+ H:%M)
 fail=$(grep Failed /var/log/secure | grep $md | wc -l

 echo "Date: $mdy Time: $tme Number of failed attempts: $fail"

 done

我做错了什么?

我执行了 for 循环,认为 i 将是日期命令,mdy 将显示 mm/dd/yy,tme 将是 HH:MM,md 将用于 grep var/log/secure 以获取失败的登录.

一旦我得到我想要的输出,我就可以通过 sh test.sh > failed.log 2> error.log

【问题讨论】:

  • 顺便说一下,grep -c 等价于grep | wc -l
  • $($i "+%m/%d/%Y") 应该做什么?
  • 就此而言,for 循环到底在做什么?您循环当前date 输出的组件...?
  • nneonneo - 我认为我应该这样做来获取信息 - 从 date 命令中获取所有信息。我将把它放到一个 error.log 文件中,这样我就可以解析该文件以查看有多少失败的登录。
  • 请准确告诉我您希望日期解析的样子。在我意识到我不明白你在寻找什么之后,我删除了我之前的评论。

标签: linux bash


【解决方案1】:

如果问题是关于重定向的,我会这样做:

#!/bin/bash

THIS_SCRIPT_NAME=$( basename $0 )
LOG_DIR='/var/log'
DATE_POSTFIX=$( date '+_%Y_%m_%d_%H_%M_%S' )
LOG_FILE="${LOG_DIR}/${THIS_SCRIPT_NAME}${DATE_POSTFIX}.log"

if [ ! -d "$LOG_DIR" ]; then
        mkdir -p "$LOG_DIR"
fi

exec 1>>"$LOG_FILE" 2>&1

【讨论】:

    【解决方案2】:

    只需删除不必要的部分并修复剩下的部分,您的脚本可能如下所示。如果您只想处理单个日期,则不需要 for 循环。

    #!/bin/bash
    mdy=$(date "+%m/%d/%Y")
    md=$(date "+%m %d")
    tme=$(date "+%H:%M")
    # Assuming the date stamp always precedes the message
    fail=$(grep -c "$md.*Failed" /var/log/secure)
    echo "Date: $mdy Time: $tme Number of failed attempts: $fail"
    

    没有太多可能出错的地方;主要是,如果您没有对 /var/log/secure 的读取权限或它不存在,则标准错误将包含一条消息。

    有一些方法可以避免多次调用date,但这几乎不会成为这里的性能瓶颈。

    【讨论】:

      【解决方案3】:

      也许您正在寻找这样的东西?我真的不知道你希望它看起来如何解析,但使用这些变量你可以随心所欲地做到这一点。但是,我相信你的 for 循环并没有做你想做的事。

      #!/bin/bash
      set -- $(date)
      DAYNAME=$1; MONTH=$2; DAY=$3; TIME=$4; YEAR=$6
      ATTEMPTS=$(grep -iw 'Failed\|$2\|$3' /var/log/secure | wc -l)
      echo "Date: $MONTH $DAY $YEAR Time: $TIME Number of failed attempts: $ATTEMPTS"
      

      【讨论】:

      • set -- $(date) 然后DAYNAME=$1; MONTH=$2; DAY=$3; TIME=$4; YEAR=$6 更简单
      • 感谢三人组。 OP,请尝试更改。
      猜你喜欢
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多