0

次のようなテキストを含むファイルがあります。

aaa.co
bbb.com
ccc.net
sss.co.uk

を抽出して別のファイルに入れる必要があり*.co.*ます*.com.*。以下を使用して抽出しましたが、個別に実行するのではなく、1つのコマンドで抽出を*.com.*行うにはどうすればよいですか?*.com.**.co.*

egrep -io '[a-z0-9\-]+\.com(\.[a-z]{2})?' input.txt | sed -e 's/www.//' | sort | uniq >output.txt

入力ファイルの例:

aaa.co
bbb.com
ccc.net
sss.co.uk 

結果ファイル:

co
com
4

4 に答える 4

3

m in comをオプションにするだけです

egrep -io '[a-z0-9\-]+\.co(m)?(\.[a-z]{2})?' input.txt | sed -e 's/www.//' | sort | uniq >output.txt

編集: sed と uniq をドロップすることもできます

awk 'match($0, "(www\\.)?([a-z0-9\\-]+\\.com?(\\.[a-z]{2})?)", r) { print r[2] }' input.txt | sort -u 

編集: sedとuniqを失う別の方法

grep -oP '^(www\.)?\K[a-z0-9\-]+\.com?(\.[a-z]{2})?(?=)$' input.txt | sort -u
于 2012-11-17T19:52:50.893 に答える
2

grepegrep

質問のコマンドラインは、、、を保持し.comます。したがって、このセクションでは、とを使用した2つの基本的な例を示します。これらのコマンドラインは、質問のコマンドラインが行うように、完全なトップレベルドメイン(TLD)を保持します。.co.co.ukgrepegrep

grep -io 'com?(\.[a-z]{2})?$' input.txt | sort -u >output.txt

またはより理解しやすい:

egrep -io 'com$|co$|co[.][a-z]{2}$' input.txt | sort -u >output.txt

参考までegrep "PATTERN1|PATTERN2"に、はと同じですgrep -E "PATTERN1|PATTERN2"

代替使用sed

次のコマンドラインは、完全なトップレベルドメイン(TLD)sedを保持しません。これは、質問で処理時に保持するように指定されているためです。co*.co.uk

sed -n '/[a-z.][.]com\?/s/.*[.]\(com\?\)\(.*\|$\)/\1/p' input.txt | sort -u >output.txt

説明

  • -n=>印刷しない
  • パターンに一致するプロセスライン/[.]com?[.]/のみ
  • s/.*[.]\(com?\)([.][a-z]{2})?/\1/com=>行をまたはで置き換えますco
  • p=>最後に行を印刷します

コマンドラインのテスト

input.txt

aaa.co
bbb.com
ccc.net
sss.co.uk
www.zzz.co
www.yyy.com
www.xxx.co.tw

に基づくテストuniq -c

sed -n '/[a-z.][.]com\?/s/.*[.]\(com\?\)\(.*\|$\)/\1/p' input.txt | sort | uniq -c

結果:

  4 co
  2 com
于 2012-11-17T21:31:55.753 に答える
1

複数の-eオプションを指定できますgrep

egrep -e '\.com\.' -e '\.co\.' ...

または代替のgrep

egrep -io '[a-z0-9\-]+\.(com|co)(\.[a-z]{2})?' input.txt | ...

またはこの特別なケースでは、「m」をオプションにします

egrep -io '[a-z0-9\-]+\.com?(\.[a-z]{2})?' input.txt | ...
于 2012-11-17T19:54:04.447 に答える
0

これはうまくいくかもしれません(GNU sed):

sed '/.*\.\(com\?\)\.\?.*/s//\1/p;d' file | sort -u
于 2012-11-18T00:13:52.323 に答える