【问题标题】:Passing shell variables in awk在 awk 中传递 shell 变量
【发布时间】:2017-08-23 12:55:11
【问题描述】:

我正在使用命令从日志文件中提取日志,当我通过终端运行该命令时该命令起作用

awk '/Aug 19/||/Aug 21/{a++}a; a==4{a=0}' daily_usage_report.log

这个命令给了我从 8 月 19 日到 8 月 21 日的数据。日志文件如下所示 -

Aug 19

Line1
Line2
Line3
Line4
Line5
Line6
Line7
Line8
Line9

Aug 19

Aug 20

Line1
Line2
Line3
Line4
Line5
Line6
Line7
Line8
Line9

Aug 20

Aug 21

Line1
Line2
Line3
Line4
Line5
Line6
Line7
Line8
Line9

Aug 21

但是当我尝试在 shell 脚本中使用相同的命令并希望将 shell 变量传递给 awk 时,它不提供任何输出。我写的shell脚本是-

#!/usr/bin/bash

echo "Please enter the Full Date [eg- Aug  2 or Aug 20]"
read -p 'From Date: ' d1var

read -p 'Till Date: ' d2var

awk -v var="$d1var" -v vari="$d2var" '/"$var"/||/"$vari" /{a++}a; a==4{a=0}' daily_usage_report.log

exit

运行此脚本不会为我提供任何输出。

请帮助纠正我的错误。

【问题讨论】:

  • 将您的代码粘贴到shellcheck.net 并解决那里标记的问题,然后请更新您的 Q。祝你好运。
  • 更正了语法但仍然没有输出
  • 这可以说是 How to use a variable as regex in awk 的副本。当然,那里的问题已经假设了最大的缺失部分(~ 运算符)。

标签: shell awk


【解决方案1】:

awk 变量与 shell 变量是不同的野兽。

  1. 不要在 awk 脚本中的 awk 变量之前放置 $ 符号。
  2. 初始 awk 脚本的正则表达式条件中没有引用您的日期,因此当它们是变量时不要引用它们。在您的情况下,正则表达式中的双引号不会起作用。

改为尝试:

awk -v var="$d1var" -v vari="$d2var" '/var/||/vari /{a++}a; a==4{a=0}' daily_usage_report.log

【讨论】:

  • 试过了,还是没有输出。感谢您的建议。已经阅读了一些教程,然后尝试修改脚本。我还是 awk 的初学者
  • 改为运行:awk -v var="$d1var" -v vari="$d2var" 'BEGIN{print var,vari}' daily_usage_report.log 并确保在 awk 脚本中正确设置了变量。这应该只是打印出两个日期作为输入,可能有助于排除故障。
  • 另外,两个日期中的空格可能有助于引用变量赋值,例如:awk -v "var=${d1var} -v "vari=${d2var}"
  • ~ 应该用于与存储正则表达式的变量进行比较
  • @JNevill,我不相信你也需要/var/(因为这是 literal 正则表达式的语法)——应该只是 ($0 ~ var || $0 ~ vari),如果没记错的话.
猜你喜欢
  • 2014-09-09
  • 2020-03-28
  • 1970-01-01
  • 2012-03-04
  • 2014-03-11
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多