【问题标题】:How to copy a command from history?如何从历史记录中复制命令?
【发布时间】:2010-10-14 19:14:42
【问题描述】:

我尝试从历史记录中复制命令。如何复制第 510 条命令?请看下面的数据。我的赌注是:

history | grep 510 | sed '1q;d' | awk '{print $2-$10}' | pbcopy

但输出为 0。我无法理解原因。命令有什么问题?

  505  find . -perm=750 -print0 | xargs -0 chmod 750
  506  find . --perm=750 -print0 | xargs -0 chmod 750
  507  find . -perm=750 -print0 | xargs -0 chmod 750
  508  find . -perm=750 -print0 | xargs -0 chmod 750
  510  find . -perm 750 -print0 | xargs -0 chmod 750
  512  history | grep perm 750 -print0 | pbcopy

【问题讨论】:

    标签: sed awk history


    【解决方案1】:

    如果您使用的是 bash:

    echo "!510" | pbcopy
    

    (另见bash manual中的“历史扩展”)

    【讨论】:

    • @UnixBasics:不要尝试在没有引号的情况下使用它,它会伤害你。
    【解决方案2】:

    您可以使用 perl 打印除请求行的第一列 (510) 以外的所有内容:

    history | perl -ane 'print "@F[1..$#F]" if($F[0]==510)'
    

    【讨论】:

      【解决方案3】:

      对于 awk 中的一系列字段,您需要一个 for 循环。你正在做的是减法,因此结果为零。

      通常 cut 命令执行提取列的任务,但有时 Awk 更合适。

      这就是你的意思。

      history | grep 510 | sed 1q \
       | awk '{for(i = 2; i <= NF; i++){ORS = (i == NF ? "\n" : " "); print $i;}}' \
       | pbcopy
      

      【讨论】:

        【解决方案4】:

        原因是$2$10 不是awk 脚本中的数字。字段的索引是从1开始的,所以如果你想要750,第一个是$5,第二个是$11

        请注意,这与带有“-perm=750”的行不同

        【讨论】:

        • 我认为这个人想要一系列领域,而不是减法。然而,惊人的巧合!
        猜你喜欢
        • 2020-02-22
        • 2021-04-12
        • 2018-06-30
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 2014-11-03
        • 2017-06-19
        • 1970-01-01
        相关资源
        最近更新 更多