
스크립트에서 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 -R
less
이스케이프 시퀀스를 표시하는 대신 강조 표시를 재현 합니다 .
가장 깔끔한 솔루션은 아니지만 일종의 답변입니다. 명령은 패턴을 강조하면서 모든 줄을 나열하는 반면 less -p
첫 번째 일치 앞의 줄은 생략합니다. 이를 재현하려면 를 사용해야 합니다 sed
.
답변2
또 다른 방법이 있습니다. 올인(all in)입니다 less
. 그러나 몇 가지 단계가 필요합니다.
less fileToShow.txt
- 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.
- 마지막으로, F꼬리 끌기를 다시 시작하려면 누르십시오.
답변3
완전한 해결책은 아니지만 몇 가지 개선 사항이 있습니다 -p
.
이는 유연한 +
플래그에 의존합니다.
명령줄 옵션이 로 시작하는 경우
+
해당 옵션의 나머지 부분은 다음을 수행하는 초기 명령으로 간주됩니다.더 적은. 예를 들어 다음과 같이+G
말합니다 .더 적은 파일의 처음이 아닌 끝에서 시작하고+/xyz
파일에서 "xyz"가 처음 나타나는 위치에서 시작하도록 지시합니다. 특별한 경우로+<number>
다음과 같이 작동합니다+<number>g
. 즉, 지정된 줄 번호에서 표시를 시작합니다(단, 위의 "g" 명령 아래에 있는 주의 사항을 참조하세요). 옵션이 로 시작하는 경우++
초기 명령은 첫 번째 파일뿐만 아니라 보고 있는 모든 파일에 적용됩니다. 앞에서 설명한 명령+
을 사용하여 모든 파일에 대한 초기 명령을 설정(또는 변경)할 수도 있습니다.
-p
첫 번째 일치 항목(또는 를 사용하는 경우 그 몇 줄 앞 --jump-target
)으로 건너뜁니다. 이것은 내가 짧게 종료할 때 결합하고 싶은 것이 아닙니다. 건너뛴 줄은 터미널의 스크롤백도 아닙니다!
시작한
less
다음 대화형으로 검색하면/ccc
less는 처음부터 줄을 먼저 표시한 다음 스크롤합니다.~일 것이다터미널의 스크롤백 버퍼의 일부가 됩니다. 다음을 사용하여 이를 에뮬레이트할 수 있지만 다음을+
사용하여 명시적으로 다시 그리기를 요청해야 합니다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
검색에는 영향을 미치지 않는 것 같습니다. 편집: 창 크기에 따라 달라지는 것 같습니다. 즉, 한 화면을 채운 다음 건너뜁니다.누가 첫 줄을 보고 싶지 않다고 말했나요? 일치하는 항목만 강조 표시하려면 빈 일치 트릭을 사용할 수 있습니다.
less -SFXE '+r/ccc|$' fileToShow.txt
하지만 이로 인해 n/ 를 사용한 탐색이 중단됩니다 N.
/
검색 시 이 플래그를 사용하는 것이 더 좋습니다 .특정 문자는 패턴 시작 부분에 입력되면 특별합니다. 패턴의 일부가 되기보다는 검색 유형을 수정합니다.
...- ^K 현재 화면의 패턴과 일치하는 텍스트를 강조 표시하지만 첫 번째 일치 항목으로 이동하지는 않습니다(현재 위치 유지).
char을 포함하는 구문은 Ctrl+K쉘에 따라 다르며 bash에서는 다음과 같이 작동합니다.
less -SFXE $'+r/\cKccc' fileToShow.txt
~
어느 쪽이든 첫 번째 줄부터 시작하면 화면을 채우는 횟수도 줄어듭니다.