두 번째와 세 번째 구분 기호를 검색하는 방법

두 번째와 세 번째 구분 기호를 검색하는 방법

그래서 데이터 파일이 있고 두 번째와 세 번째 수직 막대(|) 사이에 일치 항목이 있는 경우에만 일치 항목이 발생하도록 하고 싶습니다.

따라서 이 데이터 샘플에서 "wilson"을 검색하면 두 번째 행이 반환되기를 원하지만 "wilson"이라는 용어가 포함된 세 번째 및 다섯 번째 행은 반환되지 않습니다.

데이터 샘플:

| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |

답변1

예시 입력의 경우:

$ cat /tmp/data
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 11:40 | smith | resetpasswd | wilson |  Mozilla | 172.19.15.105 |
| 2015-08-21 - 11:41 | james | view | Main.ChangePassword |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | changepasswd | wilson |  | 172.19.15.102 |
| 2015-08-21 - 11:41 | james | view | Main.Home |  | 172.19.15.102 |
| 2015-08-22 - 08:31 | doe | view | Main.Info |  | 172.19.6.103 |

awk를 사용할 수 있습니다.

$ awk '-F|' 'BEGIN { OFS = "|" }{ if ($3 ~ "wilson") { print }  }' /tmp/data
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |

$3 ~ "wilson"또한 $3 == " wilson "행사장 주변에는 항상 공간이 있다고 가정 할 수도 있습니다.

후속 질문에 답하려면 이를 Bash 스크립트로 래핑할 수 있습니다.

$ cat foo.sh
#/bin/bash
names="$(cat patlist.txt)"

for name in ${names}; do
    awk -F'|' '$3 == " '"${name}"' "' /tmp/data
done

$ cat patlist.txt
wilson
jones

$ bash foo.sh
| 2015-08-21 - 10:31 | wilson | view | Main.Home |  | 172.19.6.107 |
| 2015-08-21 - 10:15 | jones | view | Main.Home |  | 172.29.192.106 |

답변2

가장 간단한 방법은 정규식을 다른 필드(예: )와 연결하는 것입니다 :[0-9][0-9] | wilson. 하지만 이렇게 하면 잘못된 긍정이 발생할 위험이 있습니다. 더 복잡한 것은 데이터를 가져와 awk열로 분할한 다음 awk두 번째 열에만 정규식을 적용하는 것입니다.

관련 정보