【发布时间】:2015-11-21 13:05:25
【问题描述】:
我刚刚开始学习 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,获取我可以运行的所有命令。然后我将两者的内容与循环进行比较,并在每次匹配“历史”数组中的一行时保存命令。我想,一个简单的练习需要付出很多努力。
我想到的另一个解决方案是使用正则表达式模式匹配。 命令通常从行首开始,在管道之后、执行之后或分号之后。也许更多,我只是还不知道。 所以我需要一个正则表达式,它在匹配这些条件之一后只给我下一个单词。这是我找到的命令,它似乎有效:
grep -oP '(?<=|\s/)\w+'
这里它使用管道| 作为条件。但我也需要插入其他人。所以我将模式放在双引号中,创建了一个包含所有条件的数组并按照推荐进行了尝试:
grep -oP "(?<=$condition\s/)\w+"
但是无论我如何插入变量,它都会失败。简而言之,我无法弄清楚该命令是如何工作的,尤其是正则表达式部分。
那么,如何使用正则表达式来解决呢?还是用比我更好的方法?
提前感谢您! :-)
【问题讨论】:
-
这样就可以了。
history | awk -F' ' '{print $4}'而不是 $4 添加您的命令所在的列号..
标签: regex bash shell unix command