더 적은 안에 grep?


58

나는 현재 몇 가지 문제를 찾고있는 익숙하지 않은 많은 로그를 살펴보고 있습니다. 내가 보는 첫 번째 파일은 Events.log이며, less서로 다른 시간에 동일한 이벤트를 표시하는 것으로 보이는 적어도 세 개의 페이지 가 있습니다. 이 이벤트를 필터링하고 싶습니다. 현재 종료 less하고 다음과 같은 작업을 수행합니다.

grep -v "event text" Events.log | less

이것은 이제 내가 필터링하고 싶은 다른 일반적이고 흥미롭지 않은 여러 가지 이벤트를 가져옵니다. grep -v 안에 들어갈 수있는 방법 이 less있습니까? 하지 말고

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

어떤 종류의 로그 파일을 볼 때 유용한 기능으로 생각납니다 less. 도구가 아닌 경우 원하는 품질을 가진 다른 파일 이 있습니까? 단지 less에 내장 된 스타일 뷰어 grep.

답변:


91

less매우 강력한 패턴 일치가 있습니다. 로부터 man 페이지 :

&pattern

    pattern; 와 일치하는 줄만 표시합니다 . 일치하지 않는 줄 pattern 은 표시되지 않습니다. 경우 pattern(당신이 입력하는 경우 비어 &바로 다음에 ENTER) 어떤 필터링이 해제되어, 모든 라인이 표시됩니다. 필터링이 적용되는 동안 파일의 일부 행이 숨겨 질 수 있음을 알리기 위해 프롬프트의 시작 부분에 앰퍼샌드가 표시됩니다.

    / 명령 과 같이 특정 문자는 특별합니다 .

    ^N 또는 !

      와 일치하지 않는 줄만 표시하십시오 pattern.
    ^R
      정규식 메타 문자를 해석하지 마십시오. 즉, 간단한 텍스트 비교를 수행하십시오.

    ____________
    특정 문자는 pattern; 의 시작 부분에 입력하면 특별합니다 . 검색의 일부가 아닌 검색 유형을 수정합니다 pattern.

   (물론 ^N^R대표 Ctrl+ NCtrl+ R, 각각.) 

따라서, 예를 들어, &dns패턴과 일치하는 라인 만 표시 dns하고, &!dns패턴과 일치하지 않는 경우에만 라인을 표시하는 그 라인을 필터링 (제외)됩니다.

/명령 에 대한 설명에서

    pattern시스템에서 제공하는 정규 표현식 라이브러리에 의해 인정, 정규 표현식이다.

그래서

  • &eth[01]eth0또는   포함하는 줄을 표시합니다eth1
  • &arp.*eth0arp다음에 포함 된 줄을 표시합니다.eth0
  • &arp|dnsarp또는   포함하는 줄을 표시합니다dns

그리고 !위의 어떤 것도 뒤집을 수 있습니다. 따라서 질문의 예에 사용하려는 명령은 다음과 같습니다.

&!event text|something else|the other thing|foo|bar

또한 및 을 사용 하여 검색합니다 (및 / 다음 / 이전으로 이동)./pattern?patternnN


1
거의 다 왔습니다! 에서 less'&! <1stpattern>'을 사용하면 패턴이 설정된 선을 '숨길'수 있지만 한 번에 하나의 패턴에만 적용되므로 두 번째 패턴을 찾아 '&! <2ndpattern>'을 적용하면 첫 번째 패턴과 일치하고 숨겨져있는 줄이 표시됩니다. 너무 가까이!
forquare

@forquare : 위 / 아래 화살표 키로 액세스 할 수있는 명령 기록이 있습니다. 그래서 눌러 &!다음 화살표 키를 누르십시오.
PM 2Ring

@forquare : 방금 역사가 저장되어 다음에 실행할 때 이전 패턴을 사용할 수 있음을 발견했습니다 less. 그래도 재부팅 후에도 보존되는지는 모르겠습니다.
PM 2Ring

1
내가 놓친 마지막 비트 인 @ orion-패턴을 함께 연결하는 방법. 나는 전에 파이프 기호를 사용해 보았지만 실패했지만 지금 다시 시도하면 효과가 있습니다! ! 그래서 : & <patter1을> | <하는 pattern2> | <패턴 3> patter1을하거나하는 pattern2 또는 패턴 3과 라인 제거
forquare

1
나는 그것을 알아. Homebrew dupes의 최신 버전이 있습니다. 올바른 파일을 잡지 않았기 때문에 bash를 걷어차 야했습니다. (/ user / local / bin / less를 잡아도 말 했음에도 불구하고).
spinlock

7

바탕 오리온의 대답less(1)매뉴얼 페이지 설명

/pattern

    파일 에서을 포함하는 N 번째 줄을 찾습니다 pattern.  N †의 기본값은 1입니다. 이는 pattern시스템에서 제공 한 정규식 라이브러리에서 인식되는 정규식입니다. 검색은 표시된 두 번째 줄에서 시작합니다 (그러나이 옵션을 변경하는 옵션 -a-j옵션 참조 ).

    특정 문자는 pattern; 의 시작 부분에 입력하면 특별합니다 . 그들은 다음의 일부가 아닌 검색 유형을 수정합니다 pattern.

    ^N 또는 !

      와 일치하지 않는 행을 검색하십시오 pattern.
    ^E 또는 *
      여러 파일을 검색하십시오. 즉, 일치하는 항목을 찾지 않고 검색이 현재 파일의 END에 도달하면 명령 행 목록의 다음 파일에서 검색이 계속됩니다.
    ^F 또는 @
      현재 화면에 표시되는 내용 -a이나 -j옵션 의 설정에 관계없이 명령 행 목록에서 FIRST 파일의 첫 번째 행에서 검색을 시작하십시오 .
    ^K
      pattern현재 화면 에서 에 일치하는 텍스트를 강조 표시 하지만 첫 번째 일치 항목 (KEEP 현재 위치)으로 이동하지 마십시오.
    ^R
      정규식 메타 문자를 해석하지 마십시오. 즉, 간단한 텍스트 비교를 수행하십시오.

    ____________
    명령 앞에는 설명에서 N 이라고하는 10 진수가 올 수 있습니다 .

   (물론 ^N^E등은 Ctrl+ NCtrl+ 등을 나타냅니다 E.) 

그것은이 밝혀 과 함께 잘 작동합니다. 예를 들어&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

어느 순서로 입력, 포함하는 모든 라인 숨기기 (제외됩니다) arp또는 dns(같은 grep -v) 한 다음, 나머지 라인, 모든 항목 강조 fail, fatal, faultSCSI 장치의 이름 (처럼 보이는, 또는 무엇이든 sd[a-z][0-9]). 포함하는 행합니다 arp또는 dns도하고 fail, 또는 다른 위험 단어 중 하나가됩니다 하지 표시.


2

지난 몇 달 동안 나는 다소 매혹되었습니다 fzf.

귀하의 경우, 한 컨텍스트가 필요하지 않는 한 (즉, GREP에 해당하는의를 -A, -B또는 -C필요하지 않고, 그런데, 더 적은의는 &다음 fzf는 매우 강력한 도구입니다, 같은 제한이 있습니다).

다음은 어리석은 예입니다.

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

당신이 그것을 실행 aa | bb dd | ee !gg !hh하고 등등 과 같은 입력을 가지고 놀면 , 당신은 무슨 일이 일어나고 있는지 빨리 볼 것입니다.

온 Fzf의 문서 |운영자는 스파 스,하지만 내 추측은 단지 효과, 직전 약관에 적용되며, 의미, 이후, 그 이상 우선합니다 AND (어떤 암시 , 모든 조건은 AND로 기본적으로) . 그러나 대부분의 경우 이것은 문제가되지 않아야하며 내 경험상 문제가 해결됩니다.

기회를주세요. 내가 무엇을 찾고 있는지 확실하지 않을 때와 상황이 중요하지 않을 때 탐색하는 데 놀랍게도 유용하다는 것을 알았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.