我正在编写一个脚本,以获取数百台服务器上的最新更新/补丁程序日期。由于各种原因,缺少另一个工具,我决定编写一个脚本。目前,我正在使用以下命令:
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个以上的软件包,则仅抓取该行。
答案 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'