次のように行が混在するテキストファイルがあります。
### Comments
# Comments
86.242.200.81 banana.domain.net # comment
86.242.200.3 orange.domain.net
31.28.225.81 monkey.anotherdomain.net
51.18.33.4 puffin.domainz.com
#31.28.220.80 monkey.anotherdomain.net # comment
86.242.201.3 orange.domain.net
重複したホストドメインを見つける方法は?
monkey.anotherdomain.net
この場合は2つあります。 orange.domain.net
これを念頭に置いて...
- 項目の後のコメントは重複しない可能性があるため、無視する必要があります。
- その行をコメントアウトしても、重複した行が見つかるはずです。
- IPアドレスの違いは無視する必要があります。
ベストアンサー1
興味深いです。
まず、削除する必要があります。続く次のコメント:
86.242.200.81 banana.domain.net # comment
次のコマンドを使用してこれを行うことができます(スペースのみがあり、タブはないと仮定)。
sed 's/ *#.*//'
ホストファイルにタブがある場合は、まず次のコマンドを実行できます。
tr '\t' ' '
次に、IPアドレスの前にある単一のハッシュ文字で定義されている「この行をコメントとして扱う」コメントを削除する必要があります。次のように削除できます。
sed '/^#[0-9]/ s/^#//'
上記をまとめると次のようになります。
### Comments
# Comments
86.242.200.81 banana.domain.net
86.242.200.3 orange.domain.net
31.28.225.81 monkey.anotherdomain.net
51.18.33.4 puffin.domainz.com
31.28.220.80 monkey.anotherdomain.net
86.242.201.3 orange.domain.net
2番目の列()をソートすると、名前でソートされたsort -k2
リストが表示されます。
86.242.200.81 banana.domain.net
# Comments
### Comments
31.28.220.80 monkey.anotherdomain.net
31.28.225.81 monkey.anotherdomain.net
86.242.200.3 orange.domain.net
86.242.201.3 orange.domain.net
51.18.33.4 puffin.domainz.com
最初のフィールドを無視するように指示すると、重複するuniq
項目の検索を適用できます。uniq
uniq -c -f 1
これは私たちに以下を提供します。
2
1 86.242.200.81 banana.domain.net
1 # Comments
1 ### Comments
2 31.28.220.80 monkey.anotherdomain.net
2 86.242.200.3 orange.domain.net
1 51.18.33.4 puffin.domainz.com
したがって、数が2以上の行を見つけると、重複した項目が見つかります。これをまとめると、次のような結果が得られます。
#!/bin/sh
tr '\t' ' ' |
sed '
/^#[0-9]/ s/^#//
s/ *#.*//
/^ *$/ d
' |
sort -k2 |
uniq -f 1 -c |
awk '$1 > 1 {print}'
上記のスクリプトの最後のステートメントはawk
countを使用して(field1)で行を検索します。uniq
> 1
上記のスクリプトを実行すると、次のようになります。これ。