使用Sed多个搜索模式打印特定行

时间:2016-02-24 23:25:02

标签: linux bash sed

SED命令使用多种模式

我使用sed命令搜索多个模式。 该命令在找到匹配项时工作并打印行 但是我需要做两件事(这是我使用的命令)

  sed -r '/pattern1|pattern2/!d' filename

A - 打印包含第一个图案的线条      然后不仅打印匹配第二个模式的行      但打印下面的行数。我想说明一下      第二个模式搜索下面的行数。

B - 我需要打印第一个图案,然后只打印下面一定数量的线       第二个模式但省略包含搜索模式的行

简而言之,我需要控制指定下面的行数 我的第二个serach模式,并省略包含serach patetrn的行,如果 我决定这样做

Hostname1

section1 
a

section2
a
c 
d

Hostname2

section1 
a

section2
x
y
d

所需的输出

hostname1
section2
a
c 

hostname2
section2
x
y 

1 个答案:

答案 0 :(得分:0)

# Create test file 
(
cat << EOF
Hostname1

section1
a

section2
a
c
d

Hostname2

section1
a

section2
x
y
d
EOF
) > filename

# transformation
cat filename  | grep -v "^ *$" | sed -e "s/\(Hostname\)/==\1/g" |  sed -e "s/\(section\)/=\1/g" | tr '\n' '|' | tr '=' '\n' |  sed -r '/Hostname1|Hostname2|section2/!d' | cut -d"|" -f-3 | tr '|' '\n' | grep -v "^ *$" | sed -e "s/\(Hostname\)/\n\1/g"

吃茶

# etape 1 : transforme each section to on ligne, with a dilimiter "|" :
cat filename  | grep -v "^ *$" | sed -e "s/\(Hostname\)/==\1/g" |  sed -e "s/\(section\)/=\1/g" | tr '\n' '|' | tr '=' '\n' 
#Hostname1|
#section1|a|
#section2|a|c|d|
#
#Hostname2|
#section1|a|
#section2|x|y|d|

# etape 2 : cut n+1 fild  ( cut -d"|" -f-3 ) :
cat filename |  cat filename  | grep -v "^ *$" | sed -e "s/\(Hostname\)/==\1/g" |  sed -e "s/\(section\)/=\1/g" | tr '\n' '|' | tr '=' '\n' |  sed -r '/Hostname1|Hostname2|section2/!d' | cut -d"|" -f-3
#Hostname1|
#section2|a|c
#Hostname2|
#section2|x|y

#etape 3 : transfomation to wanted format :
cat filename |  cat filename  | grep -v "^ *$" | sed -e "s/\(Hostname\)/==\1/g" |  sed -e "s/\(section\)/=\1/g" | tr '\n' '|' | tr '=' '\n' |  sed -r '/Hostname1|Hostname2|section2/!d' | cut -d"|" -f-3 | tr '|' '\n' | grep -v "^ *$" | sed -e "s/\(Hostname\)/\n\1/g"
#Hostname1
#section2
#a
#c
#
#Hostname2
#section2
#x
#y