[英]To replace one word in first line with another in 2nd line in linux with sed or awk
我有一個包含以下文本的日志。 我需要在下一行用字符串 GX4APDOCUGRLK10 / GX4DODOCGRPGT30 /.. 替換 GX81CBCCONVCH10。 然后刪除接下來的兩行。 任何人都可以使用任何 sed 或 awk 命令來幫助執行此操作。 或任何 python 腳本。
我正在用以下命令替換 vim,但它在 sed 中不起作用。 :s/\(^.*\)GX81CBCCONVCH10\(.*\n\)\(.*EXT;\)\(.*;.*;.*;\)\(.*\)\(;.*;.*\n.*RTC.*\)/\1\5\2/g
日志:
20220812 090258078;1;2727;SVC;GX81CBCCONVCH10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090258078;1;2727;EXT;SwitchOAIntf;0.995;0.000;GX4APDOCUGRLK10;P;RIDD08B825RQ11DC
20220812 090258078;1;2727;RTC;2;0;0;0;0;2;0;0;1;0;0.00060;0.00000
20220812 090303106;1;2727;SVC;GX81CBCCONVCH10;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090303106;1;2727;EXT;SwitchOAIntf;1.105;0.000;GX4DODOCGRPGT30;P;RIDO2PCD35RQ11DC
20220812 090303106;1;2727;RTC;2;0;0;0;0;2;0;0;1;0;0.00065;0.00000
20220812 090308239;1;2727;SVC;GX81CBCCONVCH10;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090308239;1;2727;EXT;SwitchOAIntf;0.881;0.000;GX4DODOCGRPGT50;P;RIDWNKFI35RQ11DC
20220812 090308239;1;2727;RTC;2;0;0;0;0;2;0;0;1;0;0.00060;0.00000
20220812 090309137;1;2727;SVC;GX81CBCCONVCH10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
20220812 090309137;1;2727;EXT;SwitchOAIntf;0.867;0.000;GX4APDOCUGRLK10;P;RIDZACDJ35RQ11DC
20220812 090309137;1;2727;RTC;2;0;0;0;0;2;0;0;1;0;0.00060;0.00000
output 應該是這樣的:
20220812 090258078;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090303106;1;2727;SVC;GX4DODOCGRPGT30;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090308239;1;2727;SVC;GX4DODOCGRPGT50;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090309137;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
使用任何 awk:
$ awk 'BEGIN{FS=OFS=";"} (NR%4)==2{rep=$8; $0=prev; $5=rep; print} {prev=$0}' file
20220812 090258078;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090303106;1;2727;SVC;GX4DODOCGRPGT30;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090308239;1;2727;SVC;GX4DODOCGRPGT50;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090309137;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
或者如果你真的想要 output 行由空行分隔,那么這也會在 output 的末尾產生一個空行:
$ awk 'BEGIN{FS=OFS=";"; ORS="\n\n"} (NR%4)==2{rep=$8; $0=prev; $5=rep; print} {prev=$0}' file
20220812 090258078;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090303106;1;2727;SVC;GX4DODOCGRPGT30;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090308239;1;2727;SVC;GX4DODOCGRPGT50;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090309137;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
或者這個不會:
$ awk 'BEGIN{FS=OFS=";"} (NR%4)==2{rep=$8; $0=prev; $5=rep; print sep $0; sep=ORS} {prev=$0}' file
20220812 090258078;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090303106;1;2727;SVC;GX4DODOCGRPGT30;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090308239;1;2727;SVC;GX4DODOCGRPGT50;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090309137;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
這可能對您有用(GNU sed):
sed -E '/(GX81CBCCONVCH)10/{s//\130/;N;N;P;d}' file
匹配GX81CBCCONVCH10
並將10
替換為30
, append 接下來的兩行並僅打印第一行。
編輯:誤解了這個問題,也許:
sed -E '/SVC/{N;N;s/GX81CBCCONVCH10(.*)\n.*EXT(;[^;]*){3};([^;]*).*\n.*RTC.*/\3\1/}' file
使用 GNU sed
$ sed -Ez 's/([^G]*)GX81CBCCONVCH10([^\n]*)\n[^G]*(GX[^;]*)[^\n]*\n[^\n]*/\1\3\2/g' input_file
20220812 090258078;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;1.015;0.023;0.996;0.014;4096;820;1;0.995;3;0.009
20220812 090303106;1;2727;SVC;GX4DODOCGRPGT30;;10.115.48.238;1.119;0.028;1.106;0.018;4096;1084;1;1.105;3;0.003
20220812 090308239;1;2727;SVC;GX4DODOCGRPGT50;;10.115.48.238;0.896;0.031;0.883;0.021;4096;1084;1;0.881;3;0.003
20220812 090309137;1;2727;SVC;GX4APDOCUGRLK10;;10.115.48.238;0.878;0.022;0.868;0.015;4096;820;1;0.867;3;0.003
你可以試試這個sed
命令(應該在任何sed
中工作):
sed '/^$/d; N; s/\(\([^;]*;\)\{4\}\)[^;]*\(;.*\)\n\([^;]*;\)\{7\}\([^;]*\).*/\1\5\3/p; N; d' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.