簡體   English   中英

在bash腳本中提取文件的兩個表達式之間的行(使用regexp,sed)

[英]Extract lines between two expressions of a file inside bash script (using regexp, sed)

我有一個包含很多行的日志文件,我必須使用bash腳本從會話開始到會話結束提取行,以進行進一步分析。

...
...

## TSM-INSTALL SESSION (pid) started at yyyy/mm/dd hh:mm:ss for host (variable) ##
...
...
...
...
...
...
...
## TSM-INSTALL SESSION (pid) ended at yyyy/mm/dd hh:mm:ss for host (variable) ##

...
...

我用谷歌搜索並找到了一個sed表達式來提取行

sed '/start_pattern_here/,/end_pattern_here/!d' inputfile

但是我找不到正確的reg表達式模式來提取信息。

我是reg exp的新手。 我還添加了我在腳本中嘗試過的所有表達式(也包括愚蠢的表達式)。

sed '/\.* started at \.* $server ##/,/\.* ended at \.* $server ##/!d' file

sed '/## TSM-INSTALL SESSION [0-9]\+ started at [0-9|\\|:]\+ for host $server ##/,/## TSM-INSTALL SESSION [0-9]\+ ended at [0-9|\\|:]\+ for host $server ##/!d' file

sed '/.\{30\}started{34\}$server ##$/,/.\{30\}ended{34\}$server ##$/!d' file

sed '/.## TSM-INSTALL SESSION\{6\}started at\{31\}$server ##$/,/.## TSM-INSTALL SESSION\{6\}ended at\{31\}$server ##$/!d' file

sed '/## TSM-INSTALL SESSION [0-9]+ started at .* $server/,/## TSM-INSTALL SESSION [0-9]+ ended at .* $server/!d' file

sed '/## TSM-INSTALL SESSION \.\.\.\.\. started at \.\.\.\.\.\.\.\.\.\. \.\.\.\.\.\.\.\. for host $server ##/,/## TSM-INSTALL SESSION \.\.\.\.\. ended at \.\.\.\.\.\.\.\.\.\. \.\.\.\.\.\.\.\. for host $server ##/!d' file

為什么不:

$(sed "/^## TSM-INSTALL SESSION .* started .* $server ##/,/^## TSM-INSTALL SESSION .* ended .* $server ##/!d" file)

您不需要看上正則表達式。 您所關心的只是領先的TSM-INSTALL SESSIONstartedended以及主機名,因此使用.*表示“介於兩者之間”。

如果將其粘貼在名為file.sed的文件中

/^## TSM-INSTALL SESSION ([0-9][0-9]*) started at [0-9][0-9]*\/[0-9][0-9]\/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] or host ([^)]*) ##/,/^## TSM-INSTALL SESSION ([0-9][0-9]*) ended at [0-9][0-9]*\/[0-9][0-9]\/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] or host ([^)]*) ##/p

然后像這樣稱呼它

sed -n -f file.sed inputfile 

我認為它將滿足您的要求。

-n使sed 打印,因此僅打印與表達式匹配的行。

暫無
暫無

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

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