-F 옵션과 패턴 일치를 사용하면 더 적습니다.

-F 옵션과 패턴 일치를 사용하면 더 적습니다.

스크립트에서 less파일을 호출하여 새 화면이 아닌 콘솔에 출력을 인쇄하고 싶습니다. 파일이 한 화면에 들어갈 만큼 짧다면 스크롤을 비활성화하고 싶습니다. 화면이 한 화면보다 길면 스크롤할 수 있기를 원하지만 맨 아래에 도달하면 less제어권을 콘솔로 되돌리고 싶습니다. 줄도 잘려야 합니다(이 경우 콘솔 창 너머로 줄 끝이 없어져도 괜찮습니다).

또한 특정 패턴을 강조하고 싶습니다.

인수에 사용하는 것은 다음과 같습니다.

less -SFXE -p "ccc" fileToShow.txt

나는 -S긴 줄을 자르고, -FX파일에 콘솔보다 줄이 적은지 감지하고, 스크롤하지 않고 모든 텍스트를 콘솔에 인쇄하고, 텍스트가 다음과 같은 경우 파일 끝에 도달하면 -E종료하는 데 사용합니다. less콘솔보다 길어서 스크롤이 필요합니다.

일치 항목을 강조 표시하는 스위치를 추가하기 전까지는 잘 작동합니다 -p.

fileToShow.txt에 다음이 포함되어 있다고 가정합니다.

aaa
bbb
ccc
ddd
eee

패턴 스위치가 없으면 다음과 같은 결과를 얻습니다.

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

패턴 일치를 추가하면 less는 콘솔 높이까지 빈 줄을 인쇄합니다(빈 줄을 표시하기 위해 물결표를 사용).

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

-p스위치를 사용하고 사용할 때 빈 줄을 표시하지 않도록 하는 방법이 있습니까 -F? (참고: "ccc" 줄은 원하는 대로 강조 표시됩니다. 의도하지 않은 부작용이 발생했을 뿐입니다.)

내 쉘은 bash 3.2.25이고 덜 버전은 입니다 436. OS는 RHEL입니다.

답변1

다음 명령은 배치 파일에 캡슐화될 수 있습니다.

 grep --color=always -E "^|$2" "$1"|less -SFXER

매개변수 $1는 파일 이름이며 $2검색 패턴입니다. 참고 사항:

  • grep -E(또는 egrep)은 둘 이상의 검색 패턴에 대한 일치를 허용합니다.
  • ^(줄 시작) 과 일치하면 모든 줄이 나열됩니다.
  • 일치하면 $2검색 문자열이 강조 표시됩니다.
  • grep --color=always강조 표시 이스케이프 시퀀스를 파이프에 복사합니다.
  • less -Rless이스케이프 시퀀스를 표시하는 대신 강조 표시를 재현 합니다 .

가장 깔끔한 솔루션은 아니지만 일종의 답변입니다. 명령은 패턴을 강조하면서 모든 줄을 나열하는 반면 less -p첫 번째 일치 앞의 줄은 생략합니다. 이를 재현하려면 를 사용해야 합니다 sed.

답변2

또 다른 방법이 있습니다. 올인(all in)입니다 less. 그러나 몇 가지 단계가 필요합니다.

  1. less fileToShow.txt
  2. Hit &ccc( ccc찾는 패턴이라고 가정). 매뉴얼 페이지에서:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. 마지막으로, F꼬리 끌기를 다시 시작하려면 누르십시오.

답변3

완전한 해결책은 아니지만 몇 가지 개선 사항이 있습니다 -p.
이는 유연한 +플래그에 의존합니다.

명령줄 옵션이 로 시작하는 경우 +해당 옵션의 나머지 부분은 다음을 수행하는 초기 명령으로 간주됩니다.더 적은. 예를 들어 다음과 같이 +G 말합니다 .더 적은 파일의 처음이 아닌 끝에서 시작하고 +/xyz파일에서 "xyz"가 처음 나타나는 위치에서 시작하도록 지시합니다. 특별한 경우로 +<number>다음과 같이 작동합니다 +<number>g. 즉, 지정된 줄 번호에서 표시를 시작합니다(단, 위의 "g" 명령 아래에 있는 주의 사항을 참조하세요). 옵션이 로 시작하는 경우 ++초기 명령은 첫 번째 파일뿐만 아니라 보고 있는 모든 파일에 적용됩니다. 앞에서 설명한 명령 + 을 사용하여 모든 파일에 대한 초기 명령을 설정(또는 변경)할 수도 있습니다.

-p첫 번째 일치 항목(또는 를 사용하는 경우 그 몇 줄 앞 --jump-target)으로 건너뜁니다. 이것은 내가 짧게 종료할 때 결합하고 싶은 것이 아닙니다. 건너뛴 줄은 터미널의 스크롤백도 아닙니다!

  1. 시작한 less다음 대화형으로 검색하면 /cccless는 처음부터 줄을 먼저 표시한 다음 스크롤합니다.~일 것이다터미널의 스크롤백 버퍼의 일부가 됩니다. 다음을 사용하여 이를 에뮬레이트할 수 있지만 다음을 +사용하여 명시적으로 다시 그리기를 요청해야 합니다 r.

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    이것은 여전히 ccc​​​​라인으로 스크롤되지만 이제는 aaa적어도 bbb스크롤 백 버퍼에 있습니다. 그러나 검색에서 많은 줄을 건너뛰는 경우:

    seq 1000 | less -SFXE +r/980
    

    스크롤백에 다음과 같은 내용이 표시됩니다.

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    나는 이것이 에 의해 조정될 것이라고 예상했지만 --max-back-scroll검색에는 영향을 미치지 않는 것 같습니다. 편집: 창 크기에 따라 달라지는 것 같습니다. 즉, 한 화면을 채운 다음 건너뜁니다.

  2. 누가 첫 줄을 보고 싶지 않다고 말했나요? 일치하는 항목만 강조 표시하려면 빈 일치 트릭을 사용할 수 있습니다.

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    하지만 이로 인해 n/ 를 사용한 탐색이 중단됩니다 N. /검색 시 이 플래그를 사용하는 것이 더 좋습니다 .

    특정 문자는 패턴 시작 부분에 입력되면 특별합니다. 패턴의 일부가 되기보다는 검색 유형을 수정합니다.
    ...

    • ^K 현재 화면의 패턴과 일치하는 텍스트를 강조 표시하지만 첫 번째 일치 항목으로 이동하지는 않습니다(현재 위치 유지).

    char을 포함하는 구문은 Ctrl+K쉘에 따라 다르며 bash에서는 다음과 같이 작동합니다.

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    ~어느 쪽이든 첫 번째 줄부터 시작하면 화면을 채우는 횟수도 줄어듭니다.

관련 정보