我已经运行命令
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
'