【问题标题】:awk resulting to null in unix shell scriptawk 导致在 unix shell 脚本中为空
【发布时间】:2018-09-19 09:16:10
【问题描述】:

我的服务器中有这个文件,我需要使用指定日期获取特定范围的行,所以我搜索了一个脚本并想出了这个。

19 Sep 2018 08:47:57,153#ad****#L****#2018-Sep-19 08:47:43 110#2018-Sep-19 
08:47:57 153#14.***sec
19 Sep 2018 09:00:25,582#jg****#L****#2018-Sep-19 09:00:22 658#2018-Sep-19 
09:00:25 582#2.***sec
19 Sep 2018 09:00:25,720#lr****#L****#2018-Sep-19 09:00:22 038#2018-Sep-19 
09:00:25 720#3.***sec
....

我在命令行输入了这个命令,效果很好:
awk '$0 >= "19 Sep 2018 09:00:00" && $0 <= "19 Sep 2018 09:05:00" '/home/../k../g../somelogfile.txt

但是当我在脚本中操作它并将变量放入其中时,没有输出。

todayl=$(date --date="19 Sept 2018 09:00:00AM")
t_i_f_o=$(date +"%d %b %Y %H:%M:%S" --date="$today")
t_f_m_a=$(date +"%d %b %Y %H:%M:%S" --date="$today + 5 minutes")

awk '$0 >= "$t_i_f_o" && $0 <= "$t_f_m_a" ' /home/m.../k.../t.../somelogfile1.txt > /home/m.../k.../t../f.../another1.txt #Tried this
awk '$0 >= "${t_i_f_o}" && $0 <= "${t_f_m_a}"' /home/m.../k.../t.../somefile2.txt > /home/m.../k.../t.../f.../another2.txt # and this

当我查看 another1.txt 和 another2.txt 的输出文件时,没有数据。我放置变量的方式有问题吗?

【问题讨论】:

  • 哦,对不起,我的意思是“约会”
  • 我只是想知道为什么当我手动将日期放入 awk 命令时效果很好。我认为我在命令本身中传递变量的方式有问题。
  • 了解 shell 扩展 here。将变量放入' qoutes 不会扩展它们。您需要将变量放在" qoutes 中,其余的都放在' qoutes 中。

标签: shell unix awk


【解决方案1】:

您需要正确地封装您的字符串。您希望 t_i_f_o 变量由 bash 扩展,但您希望 $0 由 awk 扩展。
您还需要设置LC_ALL=CLC_TIME=C 否则您将在具有不同语言环境的PC 上得到奇怪的结果(如我的)。

export LC_ALL=C
todayl=$(date --date="19 Sep 2018 09:00:00AM")
t_i_f_o=$(date +"%d %b %Y %H:%M:%S" --date="$todayl")
t_f_m_a=$(date +"%d %b %Y %H:%M:%S" --date="$todayl + 5 minutes")
awk '$0 >= "'"$t_i_f_o"'" && $0 <= "'"$t_f_m_a"'"' /tmp/1

但我“感觉”你应该只将用“#”分隔的第一个字段与日期进行比较,而不是整行:

awk -F'#' '$1 >= "'"$t_i_f_o"'" && $1 <= "'"$t_f_m_a"'"' /tmp/1

tutorialspoint 上提供实时版本。

【讨论】:

  • 我对日期没有任何问题,我回显了日期,结果符合预期,我也尝试了awk -F'#' '$1 &gt;= "'"$t_i_f_o"'" &amp;&amp; $1 &lt;= "'"$t_f_m_a"'"' /tmp/1,但结果相同:(
  • 感谢这有效,唯一没有成功的原因是我忘记删除正在测试字符串日期的变量。
  • 是的,我也刚刚发现。这是todayl,而不是today。 ; )
  • 不要使用awk -F'#' '$1 &gt;= "'"$t_i_f_o"'" &amp;&amp; $1 &lt;= "'"$t_f_m_a"'"' /tmp/1,而是使用awk -F'#' -v tifo="$t_i_f_o" -v tfma="$t_f_m_a" '$1 &gt;= tifo &amp;&amp; $1 &lt;= tfma' /tmp/1,以避免在shell变量包含意外值时出现晦涩的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多