【问题标题】:shell script not running but command line running [duplicate]shell脚本未运行但命令行正在运行[重复]
【发布时间】:2018-05-06 06:55:47
【问题描述】:

我有一个错误日志文件,内容为 -

2017/11/06 13:17:05 [notice] 18164#18164: signal process started
.
.
.

我有命令可以提取日期和通知,警告消息

cat  whole_error.log | cut -d" " -f1,3,5-20 | sort -nr | grep "warn\|notice" | awk '$1 >= 2017/09/02 && $1 <= 2017/11/06' | awk '{print $1 " " $2" " $3}'

它工作正常,我得到了预期的输出 但是,我想将开始日期和结束日期作为命令行参数输入 为此,我将脚本编写为 -

#!/bin/bash
file_name=$1
start_date=$2
end_date=$3


cat  $file_name | cut -d" " -f1,3,5-20 | sort -nr | grep "warn\|notice" | awk '$1 >= $start_date && $1 <= $end_date' | awk '{print $1 " " $2" " $3}'

但它没有返回任何东西。没有错误信息什么都没有..只是提示再次到来。 如何解决这个问题..

【问题讨论】:

  • 整个命令行可以被替换为只调用一次awk。不需要catcutsort grep
  • 另外,请参阅shellcheck.net - 正确检测到 start_dateend_date 未使用(提供有关问题的重要提示),并且还发现了无用的 cat 和由于缺少引用引起的错误。

标签: bash shell date logfile logfile-analysis


【解决方案1】:

使用-v 将shell 变量传递给awk:

#!/bin/bash

file_name=$1
start_date=$2
end_date=$3

<"$file_name" cut -d" " -f1,3,5-20 \
  | sort -nr \
  | awk -v start_date="$start_date" -v end_date="$end_date" \
      '/warn|notice/ && $1 >= start_date && $1 <= end_date {print $1 " " $2" " $3}'

【讨论】:

  • awk -v start_date="$2" -v end_date="$3" "这里换行" cat $file_name |切-d" "-f1,3,5-20 |排序-nr | grep "警告\|注意" | awk '$1 >= $start_date && $1
  • 这当然行不通。 -v 参数需要传递给使用这些值的同一 awk 实例。看看我是如何更改awk 代码的——它是start_date,而不是脚本中的$start_date
  • 那么,我应该如何将参数传递给shell脚本,回到原来的问题
  • 和你已经做的一样——我的原始代码打算作为 grepawk 组件的类似替换,其余部分保持不变。
  • 谢谢你,为我工作,但很难得到 awk 的精髓。 :) .. 希望早日学习,任何学习 awk 的参考资料都会很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
相关资源
最近更新 更多