BashでCutを使用して文字列の特定の部分を切り取ります。

BashでCutを使用して文字列の特定の部分を切り取ります。

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

おすすめ記事