ファイルの特定の行を読みたいです。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
どうすればいいですか?考えていますが、どうすればいいかわかりませんsed
。IFS
私が得た結果は次のとおりです。
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つの置換を試みます。成功しないと何も出力されません-n
。p
だから/regexp/
行と一致する必要があり、s///
唯一の rint コマンドは次のとおりであるため、rint の前に置換が発生する必要があります。sed
p
p
バナー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
}
'