Spi*_*ike 7 shell text-processing
我已经执行了以下命令
cat /proc/loadavg && date
Run Code Online (Sandbox Code Playgroud)
实际结果:
0.00 0.00 0.00 1/803 26256
Fri Aug 26 09:00:56 EEST 2016
Run Code Online (Sandbox Code Playgroud)
预期结果:
0.00 0.00 0.00 1/803 26256 @@ Fri Aug 26 09:00:56 EEST 2016
Run Code Online (Sandbox Code Playgroud)
我试过sed
和tr
,但没有奏效。
cat /proc/loadavg && date | sed 's/\n/ @@ /g'
cat /proc/loadavg && date | tr '\n' ' @@ '
Run Code Online (Sandbox Code Playgroud)
任何想法,我缺少什么?
Kus*_*nda 15
最好的办法是使用printf
. 你有两个字符串,你想用一些额外的格式输出它们。这正是printf
它的作用。
$ printf "%s @@ %s\n" "$(cat /proc/loadavg)" "$(date)"
Run Code Online (Sandbox Code Playgroud)
您的tr
尝试不起作用,因为tr
修改的是characters,而不是 words 。不过,您可以使用它用一个字符替换换行符:
$ ( cat /proc/loadavg; date ) | tr '\n' '@'
Run Code Online (Sandbox Code Playgroud)
...但它并没有完全满足您的需求。
您的sed
尝试不起作用,因为换行符从输入中剥离sed
(即sed -n '/\n/p' inputfile
永远不会打印任何内容)。
sed
如果您在编辑第一行(这将在它们之间放置一个换行符date
)时使用N
编辑命令读取第二行(来自),您仍然可以这样做:
$ ( cat /proc/loadavg; date ) | sed 'N;s/\n/ @@ /'
Run Code Online (Sandbox Code Playgroud)
...但我个人更喜欢这个printf
解决方案。
像这样:
( cat /proc/loadavg && date ) | sed 'N; s/\n/ @@ /'
Run Code Online (Sandbox Code Playgroud)
首先,您的尝试不起作用,因为管道|
仅适用于date
,而不是 no both 命令。要解决此问题,您需要cat ... && date
在子shell 中运行,然后重定向子shell 的stdout
.
然后tr '\n' ' @@ '
不起作用,因为您不能用多个字符替换一个字符。
并且sed 's/\n/ @@ /g'
不起作用,因为一次sed
只能看到一行。要让它看到换行符,您需要将两行输入合并到同一个缓冲区中。这就是N
上面所做的。