回答:
これを試して:
grep -oP '(?<=ID: )[0-9]+' file
または:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
-o
と-P
はGNUの拡張機能であることに注意してくださいgrep
。-o
BSDでも動作します。PCREのサポート-P
は、常にコンパイルされるわけでもありません。
一致するセグメントのみを取得するにはegrep
、with -o
またはgrep
with -Eo
オプションを使用します。[0-9]
正規表現として使用して、数値のみを取得します。
grep -Eo [0-9]+ filename
これを行うには多くの方法があります。例えば:
grep
最近のPCREでGNU を使用し、その後の数字を照合しますID:
。
grep -oP 'ID:\s*\K\d+' file
awk
で始まるすべての行の最後のフィールドを使用して印刷するID:
awk '/^ID:/{print $NF}' file
ただし、数値ではないフィールドも出力されます。数値のみを取得し、2番目のフィールドのみを取得するには、次を使用します。
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
GNU grepを拡張正規表現とともに使用して、2回解析します。
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
\K
最初の例では何をしていますか?
-o
、一致した部分だけを印刷するだけでなく、興味のないものも破棄します。比較echo "foobar" | grep -oP "foobar"
してecho "foobar" | grep -oP 'foo\Kbar'
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
これはID: 54376
、ファイル入力の後に発生するすべての数字とスペースのみを出力します。
{numeric、space}以外の文字を削除した後、空白行を削除し*
ないように少し速くするために、上記を少し更新しましたp
。
これは、正規表現の行に対処し/ID: 54376/
,
て$
最後とそれらにs///
すべてまたは削除*
文字は^
ない[^ 0-9]*
、その後p
rints /
任意の/
持つ行.
の残りの文字を。
{
echo line
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'
54376
1 03 2
3 03 4
5 03 6
7 03 8
9 03 10
54376
sedの使用:
{
echo "ID: 1"
echo "Line doesn't start with ID: "
echo "ID: Non-numbers"
echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'
-n
「デフォルトでは何も印刷しない」で、/^ID: [0-9][0-9]*$/
(:、その後、1桁以上は、その行の終わり「ID」で始まる)、および「この正規表現にマッチする行を」であるs/ID: //p
の形式ですs/pattern/repl/flags
- s
手段我々 '置換を行って、フラグを使用してパターン"ID: "
を置換テキスト""
(空の文字列)で置換しますp
。これは、「置換の後にこの行を印刷する」ことを意味します。
出力:
1
4
別のGNU sedコマンド、
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*/\1/p' file
それは後に任意の数を印刷します ID:
+
。1文字と3文字の違いがスクリプトがすべてので機能しないsed
場合は、おそらく次のようにしてくださいsed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
。また、ID: [0-9]
2つのの出現を含む行の最初の回答も欠落していID: [0-9]
ます。
grep + awkを使用します。
grep "^ID" your_file | awk {'print $2'}
ボーナス:読みやすい:)
grep
を使用してawk
いる場合は必要ありません。 awk '/^ID/ { print $2 }'
同じことを行い、grep行バッファリングの問題を回避します。また、@ terdonの回答のソリューションの1つとほとんど同じです。