私が持っているもの:
interface GigabitEthernet0/2/1/6.2061
description --> Some description here
service-policy input BESTEFFORT-IN
service-policy output Egress_30M
vrf VPN-s2s
ipv4 mtu 1500
ipv4 address 222.222.222.1 255.255.255.252
ipv4 unreachables disable
dot1q vlan 2061
!
interface GigabitEthernet0/2/1/6.2062
description Some Description here too
service-policy input BESTEFFORT-IN
vrf TRUSTED-3879
ipv4 mtu 1500
ipv4 address 111.111.111.111 255.255.255.252
--
[thousands of same data blocks]
私が得たいもの:
パターン1(たとえば、2/1/6.2061)とブロックの終わり(!文字でなければなりません)の間のすべてのデータを取得します。
今、多くの同様のスレッドが示すように、sedとawkを使用してさまざまなアプローチを試しました。
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2061/{p=1} p; /\!/{exit}' idc3-sfc
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
そして
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ sed -n -e '/2\/1\/6.2061/,/\!/p ; /\!/q' idc3-sfc
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
sedや!dなどのようなより多くのバリエーションがあります。私が使うなら
sed -n -e '/2\/1\/6.2061/,/\!/p ;' idc3-sfc
awk '/2\/1\/6.2061/{p=1} p' idc3-sfc
一致するものが表示されます(したがって数千行)。
私がここに投稿するものは、私が興味のあるトピックの一部です。
- sed:パターンマッチの最初の発生のみを印刷
- 2つのパターン(含む)の間で最初の発生を選択する方法
- https://www.linuxquestions.org/questions/programming-9/grep-until-certain-character-or-pattern-appears-816393/
新しいファイルを作成し、その中にサンプルテキストを入れて問題を見つけました。
私が使用している場合:
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2061/{p=1} p ; /!/{exit}' TEST
interface GigabitEthernet0/2/1/6.2061
description --> Some description here
service-policy input BESTEFFORT-IN
service-policy output Egress_30M
vrf VPN-s2s
ipv4 mtu 1500
ipv4 address 222.222.222.1 255.255.255.252
ipv4 unreachables disable
dot1q vlan 2061
!
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
["最初のテキストブロック"のため] 動作しますが、クリックして2番目のブロックをインポートしようとすると、次のようになります。
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$ awk '/2\/1\/6.2062/{p=1} p ; /!/{exit}' TEST
usr@mpls-fa-1:~/CIRCUITI_DA_DISMETTERE$
動作しません。 [6.2061の代わりにインターフェイス6.2062を検索しているため]
答え1
最初のsed
例は、2番目以降のブロックでは機能しません。/!/q
(バックスラッシュによって未定義の動作が発生する可能性があるため削除しました)、最初のブロックがすでに実行され、スクリプトがそこで停止するためです!
(スクリプトとexit
同じawk
)。したがって、ブロック後にのみ実行し、
sed -n '/2\/1\/6.2062/,/!/{p;/!/q;}'
しかし、シンプル
sed -n '/2\/1\/6.2062/,/!/p'
いくつかのCPUサイクルを無駄にしても問題ない場合は、2回目の試みと同じようにしてください。
将来のスクリプトでは、アドレスパターンにスラッシュが含まれている場合は別の区切り文字を使用することをお勧めします。
sed -n '\_2/1/6.2062_,/!/p'
読みやすくなりますか?
はい、以下を使用することもできます!d
。
sed '\_2/1/6.2062_,/!/!d'
答え2
最終的なawkスクリプトの変更は次のとおりです。
p ; /!/{exit}
到着
p {print; if (/!/) exit}
したがって、ファイルの最初のブロックの終わりではなく、関心のあるブロックを処理して終了します。