我刚开始学习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+"
但无论我如何插入变量,都会失败。为了简短起见,我无法弄清楚命令是如何工作的,尤其不是正则表达式部分。
那么,如何使用正则表达式解决它?或者采用比我更好的方法?
提前谢谢! : - )
答案 0 :(得分:0)
这很简单,效果很好
history -w /dev/stdout | cut -f1 -d ' '
答案 1 :(得分:0)
您可以将此awk
与fc
命令一起使用:
awk '{print $1}' <(fc -nl)
find
mkdir
find
touch
tty
printf
find
ls
fc -nl
列出历史记录中没有行号的条目。