Linuxシステムには、次の文字列を含むテキストファイルがあります。
appset.org 87.76.29.21 ns1.appset.org ns2.appset.org
bbchannel.eu 87.77.29.25 ns1.appset.org ns2.appset.org
cyberset.it 87.76.29.22 ns1.appset.org ns2.appset.org
cybersetsystems.com 87.76.29.21 ns1.appset.org ns2.appset.org
romelidays.com 87.98.29.21 ns1.appset.org ns2.appset.org
novaprospect.eu 87.76.29.21 ns1.appset.org ns2.appset.org
私が望むのは、IPアドレスで始まる部分を削除してウェブサイト名だけを出力することです(例appset.org
:)bbchannel.eu
。
私が試したコードは次のとおりです。
#!/bin/bash
while read p; do
echo "$p" | cut -c 1-13
done <experiment
しかし、何か間違っているようです。そのコマンドを試しましたが、sed
ロジックはまだ機能していません。私は初めてbashに触れました。どんな助けでも大変感謝します。
ベストアンサー1
作業に適したツールがありますが、これはcut
必要なものよりはるかに複雑になります。ここでbashループを使用する理由はまったくありません。ただ作業が遅くて複雑になるだけです。cut
ファイルの各行は独自に処理されます。ただし、デフォルトの区切り文字cut
は空白ではなくタブなので、スペースを切り捨てるにはそのフラグを使用するように指示する必要があります-d
。次に、特定の文字を切り取るように指示するのではなく、最初の文字を印刷するように指示します。大地そして-f 1
:
$ cut -d' ' -f 1 file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
:を使用すると、sed
最初の空白以降のすべての内容を削除しようとします。
$ sed 's/ .*//' file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
awk
または、デフォルトではスペースに分割するフィールドを使用できます。
$ awk '{print $1}' file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
またはパール:
$ perl -pe 's/\s.*//' file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
またはPerlを再利用してください:
$ perl -lane 'print $F[0]' file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
シェルでもこれを行うことができますが、大きなファイルの場合ははるかに遅くなります。一般的に良い考えではありません。:
$ while read want rest; do echo "$want"; done < file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu
またはランダム入力に対してより安全です。
$ while read -r want rest; do printf '%s\n' "$want"; done < file
appset.org
bbchannel.eu
cyberset.it
cybersetsystems.com
romelidays.com
novaprospect.eu