【发布时间】:2020-01-30 22:08:31
【问题描述】:
我正在尝试过滤掉列表的所有重复项,忽略前 n 列,最好使用 awk(但对其他实现开放)
我找到了固定列数的解决方案,但由于我不知道会有多少列,所以我需要一个范围。我找到的那个解决方案here
为清楚起见:
我想要实现的是history 的别名,它将过滤掉重复项,但保留 history_id 完整,最好不要弄乱订单。
历史就是这样的形式
ID DATE HOUR command
5612 2019-07-25 11:58:30 ls /var/log/schaubroeck/audit/2019/May/
5613 2019-07-25 12:00:22 ls /var/log/schaubroeck/
5614 2019-07-25 12:11:30 ls /etc/logrotate.d/
5615 2019-07-25 12:11:35 cat /etc/logrotate.d/samba
5616 2019-07-25 12:11:49 cat /etc/logrotate.d/named
因此,此命令适用于最多四个参数的命令,但我需要将固定列替换为一个范围以考虑所有情况:
history | awk -F "[ ]" '!keep[$4 $5 $6 $7]++'
我觉得@kvantour 让我走上了正确的道路,所以我尝试了:
history | awk '{t=$0;$1=$2=$3=$4="";k=$0;$0=t}_[k]++' | grep cd
但这仍然会产生重复的行
1102 2017-10-27 09:05:07 cd /tmp/
1109 2017-10-27 09:07:03 cd /tmp/
1112 2017-10-27 09:07:15 cd nagent-rhel_64/
1124 2017-11-07 16:38:50 cd /etc/init.d/
1127 2017-12-29 11:13:26 cd /tmp/
1144 2018-06-21 13:04:26 cd /etc/init.d/
1161 2018-06-28 09:53:21 cd /etc/init.d/
1169 2018-07-09 16:33:52 cd /var/log/
1179 2018-07-10 15:54:32 cd /etc/init.d/
【问题讨论】:
-
使用
_作为变量名而不是一个有意义的词甚至一个字母对任何程序的清晰度都没有帮助。-F" "也将 FS 设置为它已经设置的默认值。 edit您的问题提供简洁、可测试的样本输入和预期输出,以便我们为您提供帮助。 -
如果请求一个空格作为字段分隔符,请使用
-F"[ ]"。 @EdMorton 提到的默认值是任何空格和制表符序列。 -
你可以使用 uniq -f 代替 awk。
-
您说
!keep[$4 $5 $6 $7]++有效,@kvantour 显示{...}!_[k]++,但您尝试使用{...}_[k]++.而不是(您放弃了!)。 -
@EdMorton 发现得很好!我在终端中犯了同样的错字!在我将 Chris Maes 的答案标记为我的解决方案(从线程中复制它)之后,我尝试了 kvantour 的解决方案,但我不明白为什么它突然起作用了。感谢您指出这一点,现在我可以重新充满信心地继续我的 awk 之旅......