[英]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.