我在 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