다음 형식으로 IP 주소(페이로드) 목록을 가져와야 합니다.
134.27.128.0
111.245.48.0
109.21.244.0
중간에 파이프(IP로 만들어짐)를 사용하여 이 형식으로 변환합니다.
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
찾기 및 바꾸기 명령인 것 같은데 sed
제대로 작동하지 않습니다.
답변1
sed 사용유명한 Sed 퀴프 설명, 1부::39. 줄이 백슬래시 "\"로 끝나면 다음 줄에 추가합니다.(여기에서는 백슬래시에 관한 부분을 무시하고 \n
개행 문자를 필수 |
구분 기호로 대체합니다.)
sed -e :a -e '$!N; s/\n/ | /; ta' mydoc > mydoc2
에서 생산되어야 한다mydoc2
134.27.128.0 | 111.245.48.0 | 109.21.244.0
답변2
163MiB
IP
이들 중 일부(+ 일부 대안) 가 상당히 큰 파일(한 줄에 하나, ~1,300만 줄)에서 어떻게 빠르게 작동하는지 궁금합니다 .
wc -l < iplist
13144256
결과( sync; echo 3 > /proc/sys/vm/drop_caches
각 명령 후에; 몇 시간 후에 역순으로 테스트를 반복했지만 차이는 미미했습니다. 또한 를 사용하고 있다는 점에 유의하세요 gnu sed
):
강철 드라이버:
아주 느린. 2분 정도 기다린 후 중단합니다. 따라서 결과가 없습니다.
쿠엔람:
awk 'FNR!=1{print l}{l=$0};END{ORS="";print l}' ORS=' | ' iplist
real 0m3.672s
perl -pe 's/\n/ | / unless eof' iplist
real 0m12.444s
맥사이프:
paste -d\ /dev/null iplist /dev/null | paste -sd\| -
real 0m0.983s
제틸:
sed 'H;1h;$!d;x;s/\n/ | /g' iplist
real 0m4.903s
아비나쉬 라지:
time python2.7 -c'
import sys
with open(sys.argv[1]) as f:
print " | ".join(line.strip() for line in f)' iplist
real 0m3.434s
그리고
값 0x00ff:
while read -r ip; do printf '%s | ' "$ip"; done < iplist
real 3m4.321s
의미는 입니다 184.321s
. 놀랍지 않게도 이는 다음보다 200배 느립니다.맥사이프솔루션입니다.
awk를 사용하는 다른 방법은 다음과 같습니다 .
awk '$1=$1' RS= OFS=' | ' iplist
real 0m4.543s
awk '{printf "%s%s",sep,$0,sep=" | "} END {print ""}' iplist
real 0m5.511s
진주:
perl -ple '$\=eof()?"\n":" | "' iplist
real 0m9.646s
매개변수:
xargs <iplist printf ' | %s' | cut -c4-
real 0m6.326s
헤드+붙여넣기+tr+cat의 조합:
{ head -n -1 | paste -d' |' - /dev/null /dev/null | tr \\n \ ; cat ; } <iplist
real 0m0.991s
IP 목록이 그다지 크지 않은 경우 GNU coreutils
(예: 최대 50000개의 IP) 다음 명령을 사용하여 이를 수행할 수도 있습니다 pr
.
pr -$(wc -l infile) -tJS' | ' -W1000000 infile >outfile
어디
-$(wc -l infile) # no. of columns (= with no. of lines in your file)
-t # omit page headers and trailers
-J # merge lines
-S' | ' # separate columns by STRING
-W1000000 # set page width
예를 들어 6줄 파일의 경우:
134.28.128.0
111.245.28.0
109.245.24.0
128.27.88.0
122.245.48.0
103.44.204.0
주문하다:
pr -$(wc -l <infile) -tJS' | ' -W1000 infile
산출:
134.28.128.0 | 111.245.28.0 | 109.245.24.0 | 128.27.88.0 | 122.245.48.0 | 103.44.204.0
답변3
당신은 그것을 사용할 수 있습니다앗:
awk 'FNR!=1{print l}{l=$0};END{ORS="";print l}' ORS=' | ' file > new_file
ORS=' | '
설정출력 레코드 구분 기호개행 문자를 대체 합니다 ' | '
.
또는 다음을 사용하여 제자리에서 편집합니다 perl
.
perl -pe 's/\n/ | / unless eof' file
답변4
그래서 나는 모든 것에 대해 틀렸습니다. 그리고 이 질문은 나에게 많은 것을 가르쳐주었습니다 paste
. cuonglm이 올바르게 지적했듯이, paste
in files in serial 을 사용 하지 않는 한 -s
, 쓰기 시 항상 \n
infile 목록의 마지막 ewline을 출력에 추가합니다. 나는 그 행동이 기본 모드라고 잘못 믿었습니다 . 나는 분명히 강화하는 것을 즐겼던 paste -s
오해였습니다 . busybox
paste
다음 명령은 광고된 대로 작동합니다 busybox
.
paste -d'| ' - - infile </dev/null >outfile
하지만 사양대로 작동하지 않습니다. 올바른 구현은 작성된 각 시퀀스에 후행 줄줄이를 paste
계속 추가합니다 . \n
그러나 결국 그것은 큰 문제가 아닙니다.
paste -d\ - infile - </dev/null | paste -sd\| - >outfile