포트 번호를 1000부터 늘리고 싶습니다. 이 명령을 사용하여 포트에 번호를 할당할 때 모든 포트를 0으로 설정하는 방법을 알고 있습니다.
sed 's/port [0-9]\{1,5\}/port 0/g'
하지만 반대로 하는 방법을 모르겠습니다. 여러 스크립트 파일에서 2k 줄을 변경해야 합니다.
- 이게 내가 가진 거야
local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 0 remote-ip 155.16.241.11 port 3869
- 원하는 출력은 다음과 같습니다.
local-ip 155.165.170.10 port 1000 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 1001 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 1002 remote-ip 155.16.241.11 port 3869 local-ip 155.165.170.10 port 1003 remote-ip 155.16.241.11 port 3869
답변1
다음 위치에서 이 작업을 수행할 수 있어야 합니다 awk
.
awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' input.cfg > output.cfg
이렇게 하면 빈 줄이나 주석 줄에 대한 작은 안전 조치로 시작하는 모든 줄을 구문 분석 local-ip
하고 네 번째 필드(현재 포트 번호)를 1000부터 시작하여 연속적으로 증가하는 숫자로 바꿉니다.
고쳐 쓰다
귀하의 의견에 여러 파일에 대해 이 작업을 수행하겠다고 명시했으므로 다음 쉘 루프를 사용할 수 있습니다.
for f in input{1..16}.cfg; do n=${f/input/output}; awk 'BEGIN{p=1000} $1=="local-ip"{$4=p++} 1' "$f" > "$n"; done
이는 일치하는 모든 파일을 반복하고 input{1..16}.cfg
, 대체 input
하여 output
출력 파일 이름을 생성하고 n
, awk
각 입력/출력 쌍에 위 절차를 적용합니다. 포트 번호는 파일에서 로컬로 다시 번호가 지정됩니다. 즉, 각 파일은 포트 1000에서 다시 시작됩니다.
답변2
awk를 사용하는 것은 매우 간단합니다. 예를 들어:
awk 'BEGIN { portno=1000 }
{ print $1, $2, $3, portno++, $5, $6, $7, $8 }' inputfile
이는 모든 행이 예제에 표시된 대로 형식화되었다고 가정합니다.
답변3
k=1000
m=$(echo "$k\\";printf '%s' {0..9})
sed -En "
1{x;s/.*/$m/;x;}
/local-ip/!{p;d;}
G
s/(port )0( .*)\n(.*)\n.*/\1\3\2/
p;g;trst;:rst
# port+1
s/([0-8])(\n.*\1(.))/\3\2/;h;t
s/(9+)\n/_&/
:a;s/(_9*)9(0*\n)/\10\2/;ta
s/^_/0&/
s/(.)_(0+\n.*\1(.))/\3\2/
h
" file
산출:
local-ip 155.165.170.10 port 1000 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1001 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1002 remote-ip 155.16.241.11 port 3869
local-ip 155.165.170.10 port 1003 remote-ip 155.16.241.11 port 3869
1씩 증가시키기 위해서는 두 가지에 주의해야 합니다. lsd는 9가 아닌 숫자인가요 아니면 연속된 9인가요? 전자인 경우 lsd를 다음으로 높은 숫자로 대체합니다. 후자의 경우 모든 lsd 9를 0으로 변경하고 이웃을 다음으로 높은 숫자로 바꿉니다. 그런 다음 다음 반복을 위해 다시 저장합니다.
답변4
기본적으로 두 가지 옵션이 있습니다.
옵션 1:각 입력 파일에 대해 awk를 실행합니다.
# Loop over the input file numbers and run awk for each
for ((i=0; i<10; i++)); do awk '$1=="local-ip"{$4=1000+p++;}1' input$i.txt > output$i.txt; done
옵션 2: awk를 사용하여 직접 출력 파일 생성
awk 'FNR==1{p=1000; sub("input", "output", FILENAME)} $1=="local-ip"{$4=p++} {print >> FILENAME}' input*.txt
각 입력 파일에 대해 다시 시작 하지 않으려면 port 0
awk를 한 번만 실행하면 됩니다(현재 전역 값을 알 수 있도록). 또는 NR==1{p=1000}
더 간단한 논리를 사용할 수 있습니다.옵션 1:
awk 'FNR==1{sub("input", "output", FILENAME)} $1=="local-ip"{$4=1000+p++} {print >> FILENAME}' input*.txt