簡體   English   中英

在 linux 中用 sed 或 awk 將第一行中的一個單詞替換為第二行中的另一個單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM