我需要从svn日志的每一行中提取两个参数,但我无法使用grep。
我的Svn日志命令,例如
svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | grep "^r[0-9]\+ | " | cut -c2-
以这种格式输出结果:
318150 | lehors | 2002-01-28 20:48:11 +0100 (Mon, 28 Jan 2002) | 2 lines
318149 | elena | 2002-01-28 20:46:33 +0100 (Mon, 28 Jan 2002) | 12 lines
318148 | lehors | 2002-01-28 20:33:36 +0100 (Mon, 28 Jan 2002) | 2 lines
318147 | lehors | 2002-01-28 20:22:51 +0100 (Mon, 28 Jan 2002) | 2 lines
如何以此格式grep版本号(第一个参数)和日期?
318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28
答案 0 :(得分:2)
使用更强大的Awk
来对各个列进行模式匹配/提取。
.. | awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[1]}'
318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28
.. |
部分表示要包含的命令,该命令生成所需的输出,该输出管道为Awk
逻辑是非常直接的,将带有去限制器的输入线分割为|
,由FS="|"
完成。现在$1
代表你想要的第一个字段,而第二个部分则分割部分$3
并使用split()
函数分割分隔符,一个空白字符并将其存储在数组temp
,以便它可以作为temp[1]
访问,其他空格字段存在于数组中,来自病房的下一个索引。
理想情况下,我想它应该是,
svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ | \
awk 'BEGIN{FS="|"}{split($3,temp, " "); print $1,temp[2]}'
或者你可以使用GNU grep
及其-E
扩展正则表达式功能,但仅仅在同一行上显示匹配的条目就不够了,
grep -oE '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}' file
(和)
grep -oE '^[[:digit:]]{6}' file
但不能在一起,因为我使用-o
标志打印仅匹配部分。
答案 1 :(得分:1)
由于您的文件由一个空格分隔,并且您希望拥有第一列和第五列,因此使用cut
是另一种解决方案:
cut -d' ' -f1,5 < svn_log_output_file
(或管道cut -d' ' -f1,5
到您的命令)
答案 2 :(得分:1)
使用多个分隔符的更简单的方法 -
var b = new FhirJsonParser().Parse<Bundle>(new
Newtonsoft.Json.JsonTextReader(stream));
awk -F '[| ]' '{print $1, $7}' file
包含您在问题中显示的输出。
输出 -
file
当然,您不需要存储在中间文件中。你可以做 -
318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28
答案 3 :(得分:0)
awk '{print $1,$5}' file
318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28