使用 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:

$ 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

您甚至可以在 shell 中执行此操作,但是对于较大的文件来说,这会慢得多,并且通常不是一个好主意:

$ 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

相关内容