使用grep从一行中提取多个值

blu*_*ylo 3 regex bash shell awk

文件:

timestamp1 KKIE ABC=123 [5454] GHI=547 JKL=877 MNO=878      
timestamp2 GGHI ABC=544 [ 24548] GHI=883 JKL=587 MNO=874    
timestamp3 GGGIO ABC=877 [3487] GHI=77422 JKL=877 MNO=877    
timestamp4 GGDI ABC=269 [ 1896] GHI=887 JKL=877 MNO=123
Run Code Online (Sandbox Code Playgroud)

注意:您有时在'['和下一个数字之间)有一个空格.

当JKL = 877时,我想要时间戳,ABC和GHI

解决方案1:

timestamp1 ABC=123 GHI=547
timestamp3 ABC=877 GHI=77422
timestamp4 ABC=269 GHI=887 
Run Code Online (Sandbox Code Playgroud)

解决方案2(最好的一个):

TIMESTAMP   ABC GHI

timestamp1  123 547

timestamp3  877 77422

timestamp4  269 887
Run Code Online (Sandbox Code Playgroud)

我知道如何单独使用这些值,但不能同时使用所有这些值.

A.解决方案1:

grep JKL=877 file | awk '{print $1}'  
grep JKL=877 file | grep -o '.ABC=[0-9]\{3\}'
grep JKL=877 file | grep -o '.GHI=[0-9]\{3,5\}'
Run Code Online (Sandbox Code Playgroud)

没有'['问题,我会这样做:

grep JKL=877 | awk '{print $1,$3,$5}' file  
Run Code Online (Sandbox Code Playgroud)

B.对于解决方案2:

grep JKL=877 file | grep -o '.ABC=[0-9]\{3\}' | tr 'ABC=' ' ' | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

(我使用awk删除tr函数创建的空间)

grep JKL=877 file | grep -o '.GHI=[0-9]\{3,5\}' | tr 'ABC=' ' ' | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)

没有'['问题,我会这样做:

printf "TIMESTAMP       ABC       GHI\n";
awk '{print $1,$3,$5}' file | tr 'ABC=' ' ' | tr 'GHI=' ' ' 
Run Code Online (Sandbox Code Playgroud)

C.现在要把它们全部放在一起,我想到了一个循环并将匹配放在变量中(参见https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-模式): MATCH=".ABC=[0-9]\{3\} .GHI=[0-9]\{3,5\}"但我的语法有问题; 此外,它不包括时间戳.

printf "TIMESTAMP       ABC       GHI\n"
grep JKL=877 file | while read line
do
?
done 
Run Code Online (Sandbox Code Playgroud)

Thanx的帮助.

jks*_*hah 6

尝试使用 sed

printf "TIMESTAMP\tABC\tGHI\n"

sed -nr '/JKL=877/s/^(\w+).*ABC=([0-9]+).*GHI=([0-9]+).*/\1\t\2\t\3/p' file
Run Code Online (Sandbox Code Playgroud)

输出:

TIMESTAMP   ABC GHI
timestamp1  123 547
timestamp3  877 77422
timestamp4  269 887
Run Code Online (Sandbox Code Playgroud)


aba*_*asu 1

#!/bin/bash
cat input.txt
echo ""
echo "############"
echo "TIMESTAMP   ABC GHI"
sed -ne 's/\(timestamp[0-9]\).*ABC=\([0-9]*\).*GHI=\([0-9]*\).*JKL=877.*$/\1 \2 \3/gp' input.txt
Run Code Online (Sandbox Code Playgroud)

输出是

timestamp1 KKIE ABC=123 [5454] GHI=547 JKL=877 MNO=878      
timestamp2 GGHI ABC=544 [ 24548] GHI=883 JKL=587 MNO=874    
timestamp3 GGGIO ABC=877 [3487] GHI=77422 JKL=877 MNO=877    
timestamp4 GGDI ABC=269 [ 1896] GHI=887 JKL=877 MNO=123
############
TIMESTAMP   ABC GHI
timestamp1 123 547
timestamp3 877 77422
timestamp4 269 887
Run Code Online (Sandbox Code Playgroud)

如果你不使用之间的东西[然后]忽略它们