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