3

awk を使用してファイルを読み取り、+ または - で始まらない行のみを 4 回以上続けて表示しようとしています。gawkでもいいです。各グループは空白行で区切られています。

ファイルのサンプルを次に示します。これらは印刷したくない行です。

+Host is up.
+Not shown: 95 closed ports, 3 filtered ports
+PORT     STATE SERVICE   VERSION
+23/tcp   open  telnet
+9100/tcp open  jetdirect

-Host is up.
-Not shown: 99 closed ports
-PORT     STATE SERVICE VERSION
-5900/tcp open  vnc

私が印刷したいファイルのサンプル(連続して4つ以上ではありません):

-Not shown: 76 closed ports, 18 filtered ports
+Not shown: 93 closed ports
PORT    STATE SERVICE VERSION
+514/tcp open  shell

O'Reilly の awk & sed を読んでいるので、現時点で awk の使用方法を学んでいますが、この問題に少し困惑しています。また、誰かが気にかけているのであれば、シェル スクリプトを使用してこの問題を解決する awk 以外の方法を見てもかまいません。

ありがとう!

4

2 に答える 2

5

あなたの質問を理解した場合、入力ファイルには段落としてレコードが含まれているため、空白行で区切る必要があります。私は次のスクリプトのためにそれを仮定しました:

内容script.awk

BEGIN {
        ## Separate records by one or more blank lines.
        RS = ""

        ## Each line will be one field. Both for input and output.
        FS = OFS = "\n"
}

## For every paragraph...
{
        ## Flag to check if I will print the paragraph to output.
        ## If 1, print.
        ## If 0, don't print.
        output = 1

        ## Count how many consecutive rows have '+' or '-' as first
        ## character.
        j = 0

        ## Traverse all rows.
        for ( i = 1; i <= NF; i++ ) {
                if ( substr( $i, 1, 1 ) ~ /+|-/ ) {
                        ++j;
                }
                else {
                        j = 0
                }

                if ( j >= 4 ) {
                        output = 0
                        break
                }
        }

        if ( output == 1 ) {
                print $0 "\n"
        }
}

次のテスト入力ファイルを次のように想定しますinfile

+Host is up. 
+Not shown: 95 closed ports, 3 filtered ports
+PORT     STATE SERVICE   VERSION

+Host is up. 
+Not shown: 95 closed ports, 3 filtered ports
+PORT     STATE SERVICE   VERSION
+23/tcp   open  telnet
+9100/tcp open  jetdirect

-Host is up. 
-Not shown: 99 closed ports
-PORT     STATE SERVICE VERSION
-5900/tcp open  vnc 

-Not shown: 76 closed ports, 18 filtered ports
+Not shown: 93 closed ports
PORT    STATE SERVICE VERSION
+514/tcp open  shell

次のようなスクリプトを実行します。

awk -f script.awk infile

次の出力(4つの連続する行に到達しないための最初のレコードと、それらの間に異なる行があるための2番目のレコード):

+Host is up.
+Not shown: 95 closed ports, 3 filtered ports
+PORT     STATE SERVICE   VERSION

-Not shown: 76 closed ports, 18 filtered ports
+Not shown: 93 closed ports
PORT    STATE SERVICE VERSION
+514/tcp open  shell
于 2012-07-16T17:23:19.530 に答える
-1
awk '{if(NF>3 &&( $0 ~ /\+/ || $0 ~ /-/) ) print $0}' test.txt
于 2012-07-16T16:36:43.100 に答える