
最初の文字の位置に名前があるファイルがあります。すべての名前を grep する方法を探しています。ここでは、たとえば BUBBA と SUSAN という名前をリストに表示したいとします。
BUBBA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = bubba01)(PORT = xxxx))
)
(CONNECT_DATA =
(SERVICE_NAME = bubba01)
)
)
SUSAN =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = susan01)(PORT = xxxx))
)
(CONNECT_DATA =
(SID = susandb)
)
)
答え1
あなたが望んでいるのは、次のことのようです:
grep -o '^[A-Z]\+'
-o
は、行の一致する部分のみを出力することを意味し、正規表現は行の先頭の 1 つ以上の大文字のシーケンスと一致します。
この種のことは を使って行うこともできます。これはこの例では複雑すぎますが、より複雑なマッチングや変換を行う必要がある場合には便利です (また やsed
よりも単純です)。awk
perl
sed -n '/^[A-Z]\+/{s/^\([A-Z]\+\).*/\1/;p}'
答え2
使用方法awk
:
awk 'NF > 1 && $1 !~ /^\(|\)/ {print $1}' file
少なくとも 1 つのフィールド ( NF > 1
) を持つ行のみを印刷し、または(
:)
で始まる行は無視します^\(|\)
。
答え3
すべての入力ファイルが同じ形式である場合、単純な awk ソリューションは次のようになります。
awk '/^[a-Z]/ {print $1}' filename
キャラット ( ^
) を使用すると、各行の先頭に文字があるエントリのみが選択されます。次に、 を無視して最初のフィールドのみを印刷します=
。