Awk或类似命令,以获取最后一列并在Bash中对其执行一些操作

时间:2019-03-04 20:27:11

标签: bash awk grep

我正在编写一个脚本,以获取数百台服务器上的最新更新/补丁程序日期。由于各种原因,缺少另一个工具,我决定编写一个脚本。目前,我正在使用以下命令:

sudo yum history | grep [0-9] | grep -E 'Update|Install|U|I' | awk 'NR==1'

哪个给了我第一行并对其进行了操作。但这只给了我第一行,我玩弄了抓住前5行的想法,但这可能并不适用于所有情况。

sudo yum history | grep [0-9] | grep -E 'Update|Install|U|I' | awk 'NR>=1&&NR<=5'

因此,我想检查最后一列或两列,如果已更新或安装了x个以上的软件包,请抓住该行。

一般来讲,yum历史记录的输出是:

18 | first last <username>      | 2018-08-30 19:41 | E, I, U        |   43 ss
17 | first last <username>      | 2018-07-10 15:28 | E, I, U        |  230 EE
16 | first last <username>      | 2018-04-25 20:08 | E, I, U        |   44 ss
15 | first last <username>      | 2018-01-30 20:57 | E, I, O, U     |  108 EE
14 | first last <username>      | 2018-01-30 20:39 | Install        |    4   

我遇到的问题是最后两列的列位置可能不同,最后一列可能只是数字,或者可能包含字母或特殊字符。我想忽略任何具有非数字字符的最后一列,并评估最后一列是否已安装或更新了20个以上的软件包。如果最后一列包含20个以上的软件包,则仅抓取该行。

2 个答案:

答案 0 :(得分:1)

使用正则表达式,匹配最后一列中的数字。要打印所有具有> = 20更改的历史记录:

sudo yum history | \
    perl -ne '/\| *(\d+)[^\|]*$/ and $1>=20 and print($_)'

Of-如果您只想从匹配的历史记录中获取时间戳记:

sudo yum history | \
    perl -ne '
        @col=split(/\|/);
        $col[4]=~/^ *(\d+)/ and $1>=20 and print($col[2],"\n")'

答案 1 :(得分:0)

使用awk:

sudo yum history | awk -F ' *\\| *' '$4 ~ /\<(Install|Update|U|I)\>/ && $5 > 20'