【问题标题】:How to get input to long command in the end最后如何获得长命令的输入
【发布时间】:2014-11-26 10:40:25
【问题描述】:

是否可以在命令末尾输入很长的命令?下面的示例将更清楚地解释我的查询。

目前在 grepping 时我必须执行以下操作:

zgrep -i "A VERY LONG TEXT" file |awk '{print $1}'

每次我必须将光标移回“A VERY LONG TEXT”以更改模式。我想以这样一种方式更改命令,使“A VERY LONG TEXT”出现在命令的末尾,所以我可以快速改变它。

command1 |command2 |some_magic "A VERY LONG TEXT"  

我知道我可以通过执行 CAT 然后 grepping 来实现此结果,想知道是否有其他方法可以做到这一点。可能就像将其分配给临时变量一样?

示例 2:

我需要在我的会话文件中获取所有命令及其输出的实时时间戳。所以我必须使用以下命令。但在执行任何命令之前,我必须将光标移动到 unbuffer 并更改命令。有什么方法可以更改以下命令,以便可以在行尾输入命令?

    /yumm 194>unbuffer ls -lrt | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'  
    2014-10-01 10:38:19 total 0
    2014-10-01 10:38:19 -rw-rw-r--  1 user bcam 0 Oct  1 10:37 1
    2014-10-01 10:38:19 -rw-rw-r--  1 user bcam 0 Oct  1 10:38 test1
    2014-10-01 10:38:19 -rw-rw-r--  1 user bcam 0 Oct  1 10:38 test2
    2014-10-01 10:38:19 -rw-rw-r--  1 user bcam 0 Oct  1 10:38 test3
    2014-10-01 10:38:19 -rw-rw-r--  1 user bcam 0 Oct  1 10:38 test4
   yumm 195>

简而言之,我需要一些命令来获取我执行的所有命令及其输出的时间戳。

【问题讨论】:

  • 你到底要改变哪一部分?只是unbuffer 或更多内容?

标签: linux unix awk grep command


【解决方案1】:

如果你只是将此文本设置为一个变量呢?

mystring="A VERY LONG TEXT"
zgrep -i "$mystring" file | awk '{print $1}'
         ^         ^
         note you need double quotes to make it work

根据您的编辑,您还可以:

awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }' <<< "$(unbuffer ls -ltr)"
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

  • 请看示例 2,我已尝试清楚地提出我的查询。抱歉没有明确提及我的期望。
  • 你想改变什么?直到管道?然后,awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }' &lt;&lt;&lt; "$(ls -ltr)" 应该可以。查看我的更新。
  • 你明白我在找什么,我尝试了你的建议,但它在我的服务器上不起作用?我在这里做错了吗? user>awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'
  • @user2809888 奇怪,它对我来说很好用。您使用的是普通的 bash 还是其他的东西?另外,请确保您完全按原样复制答案。也许您也可以尝试使用awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }' &lt;&lt;&lt; "$(ls -ltr)"。也就是说,没有ls -ltr
  • @user2809888 不知道该说什么,我不知道这里出了什么问题。我给出了两个在本地对我有用的可能答案,我不确定为什么它们不在您的系统中。 xargs 不是一个好方法,它会过于复杂。正如我最初所说,我会使用变量。
【解决方案2】:

编辑并重新提交命令时,使用:

Ctrl-A 快速将光标移回行首

Ctrl-E 快速移动到行尾

Alt-F前进一个字

Alt-B 向后移动一个字

或者使用fc 命令在编辑器中打开最后一个命令并允许您进行编辑——比如使用vi 命令,然后当您保存它时,它会重新提交执行。

【讨论】:

    【解决方案3】:

    这些快捷键或许能帮到你。

    Ctrl-a: move to beginning of line
    Ctrl-e: move to end of line
    Ctrl-b: move to previous character    
    Ctrl-f: move to next character
    
    Ctrl-p: previous command (same as "UP" key in bash history)
    Ctrl-n: next command (same as "DOWN" key in bash history)
    
    Ctrl-h: Delete backward character
    Ctrl-d: Delete current cursored character
    Ctrl-k: Delete characters after cursor
    

    如果您了解 Emacs 编辑器,您可以轻松地进行映像。 这些快捷键与 emacs 相同。

    【讨论】:

      【解决方案4】:

      你可以定义一个函数,例如,在你的~/.bash_profile:

      some_magic() {
          zgrep "$1" file | awk '{print $1}'
      }
      

      并按以下方式使用它:

      some_magic "A VERY LONG TEXT"
      

      对于第二个示例,一旦命令输出通过管道传输,它就会被管道缓冲。因此,在管道另一端获取的时间戳是错误的。无论如何,如果您不介意时间戳错误,可以使用此功能:

      some_other_magic() {
          $1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
      }
      

      并按以下方式使用它:

      some_other_magic "ls -lrt"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-16
        • 2022-06-11
        • 1970-01-01
        • 2019-12-28
        • 2023-01-13
        • 2016-10-30
        相关资源
        最近更新 更多