Bash Substring多个参数

时间:2017-02-17 08:45:30

标签: bash

我需要从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

4 个答案:

答案 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