簡體   English   中英

Bash子字符串多個參數

[英]Bash Substring multiple parameters

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

為此,請使用更強大的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

.. | part表示要包含的命令,該命令產生所需的輸出,並通過管線傳遞到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標志來打印僅匹配項。

由於您的文件由單個空格分隔,並且您希望具有第一列和第五列,因此這是使用cut另一種解決方案:

cut -d' ' -f1,5 < svn_log_output_file

(或cut -d' ' -f1,5到命令中)

具有多個定界符的簡單得多的方法-

awk -F '[| ]' '{print $1, $7}' file

file包含您在問題中顯示的輸出。

輸出 -

318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28

當然,您不需要存儲在中間文件中。 你可以做-

svn log http://svn.apache.org/repos/asf/xerces/java/trunk/ \
| grep "^r[0-9]\+ | " | cut -c2- | \
awk -F '[| ]' '{print $1, $7}'
awk '{print $1,$5}' file

318150 2002-01-28
318149 2002-01-28
318148 2002-01-28
318147 2002-01-28

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM