ファイルから指定された行を読む - BASH

ファイルから指定された行を読む - BASH

ファイルの特定の行を読みたいです。iptables。読みたい:そしてスペース

ファイルテーブル

 # Generated by iptables 04:13:50 2015
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]


-A INPUT -p tcp -m tcp --sport http --dport 1024: -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport https --dport 1024: -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport webcache --dport 1024: -m state --state ESTABLISHED -j ACCEPT
COMIT
# Completed on Mon Dec 04:13:50 2015

私のもの出力そうする必要があります。

INPUT
FORWARD
OUTPUT

どうすればいいですか?考えていますが、どうすればいいかわかりませんsedIFS

私が得た結果は次のとおりです。

13:50  
INPUT
0]
FORWARD
0]
OUTPUT
0]
13:50

実行後:

grep -Po ':\K[^ ]*' file

13:50その他0]の関連項目を省略したいと思います。

私の目標はチェーン名

答え1

以下を使用することをお勧めしますgrep

grep -Po '^ *:\K[^ ]*' file

説明する:

  • -P:Perl準拠の正規表現を使用します。
  • -o:一致する部分のみ印刷
  • \K:これまでに一致したすべての項目を切り取ります。
  • [^ ]*:空白を除くすべての項目と0回以上一致します。

出力:

INPUT
FORWARD
OUTPUT

答え2

その他sed:

sed -ne's/^:\([[:upper:]]*\).* $/\1/p' <in >out

s///このコマンドは、入力行ごとに1つの置換を試みます。成功しないと何も出力されません-npだから/regexp/行と一致する必要があり、s///唯一の rint コマンドは次のとおりであるため、rint の前に置換が発生する必要があります。sedppバナーs///代替文について。

入力行を一致させるには、最初に行の先頭:にコロンを一致させ、その後にゼロ個以上の大文字と小文字のアルファベット文字、次に0個以上の他の種類の文字、最後に少なくとも行末に一致する必要があります。 。宇宙。^*[[:upper:]]*.$

一致すると、[[:upper:]]サブグループで参照される -char シーケンスが 。\(\)\1

ただし、例はスペースで始まり、スペースで終わるため、サンプル入力では機能しません。あなたの例の正規表現は次のとおりです。

sed -ne's/^ *:\([[:upper:]]*\).*/\1/p'

ほとんど同じですが、行の末尾にある数のスペースを探すのではなく、頭の部分で任意の数のスペースを探します。


INPUT
FORWARD
OUTPUT

答え3

これを行うには、次のようにしますsed

sed -n '             # -n do not print lines to output by default
    /^:.* $/ {       # address lines beginning with colon, ending with space
        s/^://       # remove colon at beginning of line
        s/ .*//      # remove first space and everything following
        p            # print the edited line
    }
'

関連情報