【问题标题】:Get all Commands without arguments from history (with Regex)从历史中获取所有不带参数的命令(使用正则表达式)
【发布时间】: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


【解决方案1】:

这很简单,效果很好

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

【讨论】:

    【解决方案2】:

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

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

    fc -nl 列出历史记录中的条目,但不包含行号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2020-05-21
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多