从 grep 输出中提取一些列

从 grep 输出中提取一些列

我已经运行命令

grep -a --binary-file=text "DLDM" /home/path/ldm.log-$1* | grep -a "$line"

输出是这样的:-

/home/path/ldm.log2015:"unix","20150518 11:36:09",DLDM,CUST_PP,"unix%unix@pp",11,0,,"7A104802E728","4529800000","123456789",0,0,0,0,3,"75126BFC5DA0|548B0F66882B|250E4473F3C6",,0,"COUNTRY_CODE",21,5769,15,0,1,"CURRENCY",0.0255,1,,,,"","","001",6,"20150518 11:36:09","",""

我只想打印特定的列,例如

20150518 11:36:09 , 7A104802E728 , 4529800000 , 123456789 , CURRENCY

如果可能的话我可以更改CURRENCY为其他内容(例如:META)作为输出中的字符串吗?

答案1

你能用awk,至少代替第二个grep吗?就像是

grep -a --binary-file=text "DLDM" /home/path/ldm.log-$1* |  awk -F, "/$line/ {print \$2 \",\" \$9 \",\" \$10 \",\" \$11 \",META\"}"

请注意,所有转义都是为了您可以$line在模式中使用,如果您不需要它作为变量,您可以使用单引号作为外部引号,并忽略大部分内部引号。

要将字符串 CURRENCY 替换为 META,请将其更改awk为如下:

grep -a --binary-file=text "DLDM" /home/path/ldm.log-$1* | awk -F, "/$line/ {gsub(\"CURRENCY\", \"META\", \$26);print \$2 \",\" \$9 \",\" \$10 \",\" \$11 \",\" \$26}"

答案2

用于cut提取您需要的列(为我们提供列号将是一种善意),并sed更改文本:

grep ... | cut -d, -f2,9,10,11,26 | sed -e 's/CURRENCY/META/' -e 's/"//g'

输出

20150518 11:36:09,7A104802E728,4529800000,123456789,META

另一种方法是使用具有适当 CSV 解析器的语言,因为您的输入数据看起来像格式良好的 CSV(忽略第一个冒号之前的部分)

grep ... | ruby -rcsv -ne '
    csv_text = $_[/(?<=:).+/]           # ignore up to the first colon
    row = CSV.parse_line csv_text       # parse
    out = row.values_at(1,8,9,10,25)    # extract your fields
    out[-1]["CURRENCY"] = "META"        # text replacement of last field
    puts CSV.generate_line out          # output                       
'

相关内容