从历史记录中获取所有没有参数的命令(使用Regex)

时间:2015-11-21 13:05:26

标签: regex bash shell unix command

我刚开始学习shell命令以及如何在bash中编写脚本。 现在我想解决标题中提到的任务。 我从history命令获得的内容(没有行号):

ls [options/arguments] | grep [options/arguments]
find [...] exec- sed [...]
du [...]; awk [...] file

我的输出应该如何:

ls
grep
find
sed
du
awk

我已经找到了解决方案,但它并不能让我满意。到目前为止,我声明了三个数组,使用readarray -t << (...)命令两次,以便保存我的历史内容,然后与compgen -ac结合使用,以获取我可以运行的所有命令。然后我将两者的内容与循环进行比较,并在每次匹配“history”数组中的一行时保存命令。我想,为简单的练习付出了很多努力。

我想到的另一个解决方案是用正则表达式模式匹配来做。 命令通常从行的开头,管道,执行或分号后开始。也许更多,我还不知道。 所以我需要一个正则表达式,在匹配其中一个条件后,它只给出了下一个单词。这是我发现的命令,似乎有效:

grep -oP '(?<=|\s/)\w+'

这里使用管道|作为条件。但我也需要插入其他的。所以我把模式放在双引号中,创建了一个包含所有条件的数组,并按照建议进行了尝试:

grep -oP "(?<=$condition\s/)\w+"

但无论我如何插入变量,都会失败。为了简短起见,我无法弄清楚命令是如何工作的,尤其不是正则表达式部分。

那么,如何使用正则表达式解决它?或者采用比我更好的方法?

提前谢谢! : - )

2 个答案:

答案 0 :(得分:0)

这很简单,效果很好

history -w /dev/stdout | cut -f1 -d ' '

答案 1 :(得分:0)

您可以将此awkfc命令一起使用:

awk '{print $1}' <(fc -nl)
find
mkdir
find
touch
tty
printf
find
ls

fc -nl列出历史记录中没有行号的条目。