如何使用awk bash仅基于日期进行呼叫

时间:2018-11-19 16:36:50

标签: linux bash awk command-line

我需要bash awk命令的帮助。

我想要这个输出:

Aug 05 08:54:52 Installed: perl-XML-Simple-2.14-4.fc6.noarch
Aug 05 08:57:10 Installed: yum-utils-1.1.16-21.el5.centos.noarch
Aug 05 14:59:19 Installed: libgcc-4.1.2-55.el5.i386
Aug 05 14:59:19 Installed: libstdc++-4.1.2-55.el5.i386

我尝试过:cat /var/log/yum.log | awk '{ print $1, $2, $3 } print 'Aug 05'' 但它不起作用。有人可以根据日期提供正确的命令帮助我吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

我认为您想要awk '/Aug 05/' /var/log/yum.loggrep "Aug 05" /var/log/yum.log(根据建议进行编辑)。好像您希望在8月5日时看到日志文件的整个行。 Awk默认会打印与模式匹配的任何行。

顺便说一下,您不必将文件添加到awk中。 Awk可以将文件名作为参数并对其进行处理。模式通常(总是?)跟随命令块。该模式由/分隔,并且可以包含典型的正则表达式。

答案 1 :(得分:1)

正确的语法实际上是:

awk '/Aug 05/ { print $0 }'  /var/log/yum.log

我将打印 $ 0 ,因为在您的示例中,您提到的字段仅会打印日期。

致谢!

答案 2 :(得分:0)

我将在具有yum / rpm的系统上执行以下操作:

#!/bin/bash

file=/tmp/file.dat
rpm -qa --qf '%{INSTALLTIME} (%{INSTALLTIME:date}): %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | sort -n > $file

# Date Ranges
start="Apr 28 07:50:01 2015"
finish="Feb 10 10:00:10 2017"

# Print items between range
while IFS= read -r line ;do
        curr=$(echo "$line" | awk '{print $1}')
        if [ $curr -ge $(date -d "${start}" +"%s") ] && [ $curr -le $(date -d "${finish}" +"%s") ] ;then
                echo $line
        fi
done < "${file}"
[[ -f $file ]] && rm -f "${file}"