![使用 sed 或 awk 在行前添加文件前缀](https://linux22.com/image/75280/%E4%BD%BF%E7%94%A8%20sed%20%E6%88%96%20awk%20%E5%9C%A8%E8%A1%8C%E5%89%8D%E6%B7%BB%E5%8A%A0%E6%96%87%E4%BB%B6%E5%89%8D%E7%BC%80.png)
如何更改示例输入文件以获得类似于下面的输出文件的内容?
输入文件:
/tmp/日志 2015 年 10 月 13 日 00:19:13 温度日志1 10/13/15 00:19:13 虚拟日志 2015年10月13日 01:19:12 测试 2015 年 10 月 13 日 01:19:12 错误 /tmp/错误 2015 年 10 月 13 日 00:16:10 x 2015 年 10 月 13 日 00:16:10 2015 年 10 月 13 日 01:16:10 2015 年 10 月 13 日 01:16:10 /tmp/访问 2015 年 10 月 13 日 00:56:14 b 2015 年 10 月 13 日 00:56:14
输出文件:
/tmp/日志 10/13/15 00:19:13 templogs1 /tmp/logs 10/13/15 00:19:13 虚拟日志 /tmp/logs 10/13/15 01:19:12 测试 /tmp/logs 10/13/15 01:19:12 错误 /tmp/错误 10/13/15 00:16:10 x /tmp/错误 10/13/15 00:16:10 y /tmp/错误 10/13/15 01:16:10 z /tmp/错误 10/13/15 01:16:10 a /tmp/access 10/13/15 00:56:14 b /tmp/access 10/13/15 00:56:14 c
答案1
尝试用sed
sed '
/^\//{ # execite block if line start with «/»
h # put line into hold-space
d # clean, return to beginning
} # end block
G # append hold-space to line
s/\(.*\)\n\(.*\)/\2 \1/ # exchange first and last part of line
' input.file > output.file
和其他变体
sed '
/^\//{ # execute from line started with «/»
:1 # mark return point
N # get next line
/\n\//D # if such next line started «/» remove previous
#+and starts from the beginning with last line
s/\n/ /p # change newline with space and prints both lines
s/ .*// # removes last line
$!b1 # return to marked point with fist line if not end
d # clean all (finish)
}
' input.file > output.file
答案2
尝试
awk 'substr($1,1,1) == "/" { prefix=$0 ; next ; }
{ printf "%s %s\n",prefix,$0;}'
这将捕获以 ' /
' 开头的前缀...