예제 로그 메시지에는
20161110-15:29:39.707932513|8=FIX.4.29=031735=D34=00000389552=20161110-15:29:39.70749=413050=11156=DDG109=4130115=EAGLE7|EAGLE7116=eagle_fix_trader11|eagle_fix_trader11144=DAU|E7T9139=eagle_fix_trader119195=U439=805440=150854029208=221=1167=FUT55=14198040=259=054=111=41301110400144=0000035.0000000038=00000000760=20161110-15:29:39.70710=092
위에서 어떻게 9139 값만 표시하여 다음과 같이 보이도록 할 수 있습니까?
9139=eagle_fix_trader11
다음 명령을 사용했습니다.
ls | grep -Eo '9139=[a-z]{0,8}' 9707le8.log
하지만 난 단지 얻을 뿐이야
9139=eagle
바꾸다
9139=eagle_fix_trader11
어떤 아이디어가 있나요?
답변1
우선 ls |
거기에는 전혀 쓸모가 없습니다. 9707le8.log
현재 디렉토리(인쇄된 디렉토리)의 파일 및 디렉토리 목록이 아닌 file 내에서 검색하려고 합니다 ls
. 그럼에도 불구하고 grep
파이프로 연결된 모든 입력( )은 명령줄에서 검색할 파일 이름이 주어지면 무시됩니다.| grep
즉, 정규 표현식은 " 9139=
<= 8개의 소문자 뒤에 오는 문자열 찾기"를 의미합니다. 그러나 ; =
뒤에는 5글자만 있습니다. 여섯 번째 문자는 문자 그룹 _
에 속하지 않는 입니다 . [a-z]
간단한 해결책은 다음을 클래스에 추가하는 것입니다.
$ grep -Eo '9139=[a-z_]{0,8}' 9707le8.log
9139=eagle_fi
이제 원하는 대로 9139=eagle_fix11
문자를 추가해야 합니다.
$ grep -Eo '9139=[a-z_]{0,18}' 9707le8.log
9139=eagle_fix_trader
[a-z_]
이번에는 숫자 가 포함되어 있지 않아서 일치하지 않는다는 것이 문제입니다 . 그래서 당신은 다음과 같은 것을 원합니다 :
$ grep -Eo '9139=[a-z_0-9]{0,18}' 9707le8.log
9139=eagle_fix_trader11
9139=
또는 소문자 문자열이나 두 개의 숫자가 필요한 보다 일반적인 경우에는 다음을 _
사용할 수 있습니다.
$ grep -Eo '9139=[a-z_]+[0-9]{2}' 9707le8.log
9139=eagle_fix_trader11
또는 GNU grep을 사용하십시오.
$ grep -Po '9139=[a-z_]+\d{2}' 9707le8.log
9139=eagle_fix_trader11