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                       
'

관련 정보