나는 명령을 실행했다
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
'