![](/img/trans.png)
[英]Modify lines in a file between two matching strings using sed or awk in bash
[英]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 SESSION
, started
或ended
以及主機名,因此使用.*
表示“介於兩者之間”。
如果將其粘貼在名為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.