Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 最后如何获得long命令的输入_Linux_Unix_Awk_Grep_Command - Fatal编程技术网

Linux 最后如何获得long命令的输入

Linux 最后如何获得long命令的输入,linux,unix,awk,grep,command,Linux,Unix,Awk,Grep,Command,是否可以在命令末尾为一个很长的命令提供输入?下面的例子将更清楚地解释我的问题 目前,在进行grepping时,我必须执行以下操作: zgrep -i "A VERY LONG TEXT" file |awk '{print $1}' 每次我都必须将光标移回一个很长的文本来更改模式。我想以这样一种方式更改命令,即在命令末尾出现一个很长的文本,以便我可以快速更改它 command1 |command2 |some_magic "A VERY LONG TEXT" 我知道我可以通过做CAT和g

是否可以在命令末尾为一个很长的命令提供输入?下面的例子将更清楚地解释我的问题

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

zgrep -i "A VERY LONG TEXT" file |awk '{print $1}'
每次我都必须将光标移回一个很长的文本来更改模式。我想以这样一种方式更改命令,即在命令末尾出现一个很长的文本,以便我可以快速更改它

command1 |command2 |some_magic "A VERY LONG TEXT"  
我知道我可以通过做CAT和grepping来达到这个效果,我想知道是否有其他方法可以做到这一点。可能类似于将其分配给临时变量

例2: 我需要在我的会话文件中获得所有命令及其输出的实时标记。因此我必须使用下面的命令。但在执行任何命令之前,我必须移动光标直到解除缓冲并更改命令。是否有任何方法可以更改下面的命令,以便在行尾输入命令

    /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>

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

如果您只是将此文本设置为变量,会怎么样

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

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

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

Ctrl-E快速移动到行的末尾

Alt-F向前移动一个单词

Alt-B向后移动一个单词


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

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

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相同。

您可以在~/.bash\u配置文件中定义函数:

并按以下方式使用:

some_magic "A VERY LONG TEXT"
some_other_magic "ls -lrt"
对于第二个示例,只要命令输出通过管道传输,它就会被管道缓冲。因此,在管道另一侧获取的时间戳是错误的。无论如何,如果您不介意使用错误的时间戳,您可以使用此函数:

some_other_magic() {
    $1 | awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
}
并按以下方式使用:

some_magic "A VERY LONG TEXT"
some_other_magic "ls -lrt"

请参见示例2,我试图清楚地表达我的疑问。很抱歉没有清楚地提到我的期望。您想更改什么?就在烟斗前?然后,awk“{print strftime%Y-%m-%d%H:%m:%S,$0;}”您了解我在寻找什么,我尝试了您的建议,但它在我的服务器上不起作用?我做错什么了吗?用户>awk'{打印strftime%Y-%m-%d%H:%m:%S,$0;}'@user2809888奇怪,它对我来说工作正常。您使用的是普通bash还是其他什么?此外,请确保您完全按照原样复制答案。也许你也可以试着用awk'{print strftime%Y-%m-%d%H:%m:%S,$0;}'@user2809888不知道该说什么,我不知道这里出了什么问题。我给了两个可能在本地工作的答案,我不知道为什么它们不在您的系统中。xargs不是一个好方法,它会过于复杂。正如我最初所说,我会使用一个变量。你到底要改变哪一部分?只是不缓冲还是更多的东西?