如何最终输入long命令

时间:2014-10-01 14:37:07

标签: linux unix awk grep command

在命令结尾处是否可以将输入提供给一个非常长的命令?下面的例子可以更清楚地解释我的查询。

目前正在进行点击,我必须这样做:

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

每次我必须将光标移回“非常长的文本”来更改模式。我想改变命令,以便在命令结束时出现“非常长的文本”我可以快速改变它。

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>

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

4 个答案:

答案 0 :(得分:0)

如果您只是将此文本设置为变量怎么办?

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)"
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^

答案 1 :(得分:0)

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

Ctrl-A将光标快速移回到行的开头

Ctrl-E快速移至行尾

Alt-F向前移动一个字

Alt-B向后移动一个字

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

答案 2 :(得分:0)

这些快捷键可能对您有帮助。

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一样是密钥绑定。

答案 3 :(得分:0)

您可以定义一项功能,例如在~/.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"