在awk中传递shell变量

在awk中传递shell变量,shell,awk,Shell,Awk,我正在使用一个命令从日志文件中提取日志,当我通过终端运行它时,该命令会起作用 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

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

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
运行此脚本不会为我提供任何输出


请帮助纠正我的错误。

awk变量与shell变量不同

  • 在awk脚本中,不要在awk变量前面加$符号
  • 初始awk脚本的正则表达式条件中没有引用日期,因此当日期是变量时,不要引用它们。在你的例子中,正则表达式中的双引号是行不通的 相反,请尝试:

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

    将您的代码粘贴到中并解决其中标记的问题,然后请更新您的Q。祝你好运。更正了语法,但仍然没有输出。这可以说是的副本。当然,这里的问题已经假设了最大的缺失部分(
    ~
    操作符)。尝试过了,仍然没有输出。谢谢你的建议。阅读了一些教程,然后尝试修改脚本。我仍然是awkInstead run的初学者:
    awk-v var=“$d1var”-v vari=“$d2var”'开始{print var,vari}'每日使用情况报告.log
    ,并确保变量在awk脚本中正确设置。这应该只是将这两个日期打印出来作为输入,并且可能有助于排除故障。另外,由于两个日期中有空格,因此可以引用变量赋值,例如:
    awk-v“var=${d1var}-v”vari=${d2var}“
    ~
    应用于与存储regex@JNevill,我认为您也不需要
    /var/
    (这是文字正则表达式的语法)——只要是
    ($0~var | |$0~vari)
    ,如果内存可用的话。