如何在bash中使用该模式下的特定模式和特定内容进行grep,排除该文件中的所有其他内容

时间:2018-01-25 08:46:12

标签: awk sed grep

我有一个lib文件,我想grep特定的单元格,该单元格的引脚和方向,而忽略了另一个单元格的其他不需要的数据以及相应的引脚和方向。我有大约10个细胞

lib文件

macro cell A
class
origin
size
pin:sdf
direction:input
layer
port
end

macro cell B
class
origin
size
pin:vcc
direction:output
layer
port
end

macro cell C
class
origin
size
pin:vee
direction:inout
layer
port
end

输出我想要的东西

macro cell A
pin:sdf
direction:input

我该怎么做

2 个答案:

答案 0 :(得分:2)

您可以使用以下awk命令:

macroToSelect="macro cell A"; 
awk -v var="$macroToSelect" '{if($0 == var){f=1;print}}/^pin:/{if(f)print}/^direction:/{if(f){print; exit}}' libfile

输入的输出:

macro cell A
pin:sdf
direction:input

<强>解释

  • -v var="$macroToSelect"您将变量值传递给awk以选择特定的宏单元格
  • {if($0 == var){f=1;print}}当live等于您传递的变量时,您将f值更改为1,默认情况下为0并打印该行
  • /^pin:/{if(f)print}当您遇到以:pin开头的行时,如果f为1则打印该行
  • /^direction:/{if(f){print; exit}你为direction:做同样的事情,但这次你停止执行命令

<强>试验:

enter image description here

如果您只想使用引脚和方向打印所有记录,那么您可以使用:

 awk '/^(pin:|direction:|macro cell)/{print}' libfile

答案 1 :(得分:1)

您还可以使用egrep根据&#34;宏单元&#34;分隔所需的块,然后再次egrep来删除不需要的字段:

egrep -A 5 'macro cell' input_file | egrep -iv 'origin|class|size'

您还可以将第二部分更改为仅包含所需字段:

egrep -A 5 'macro cell' input_file | egrep -i 'macro|pin|direction'

模式后-A 5打印5行。这是在假设只有一个宏小区A&#34;在文件中,块总是具有相同的结构。不漂亮,但它适用于这种特殊情况。