나는 종종 줄이 매우 긴 파일을 grep하여 일치하는 단어 하나에 대한 출력 페이지를 생성합니다.
터미널과 너비가 같은 문자로만 출력을 제한하는 좋은 방법은 무엇입니까?
나는 이것이 일치하는 단어를 의미한다는 것을 깨달았습니다가능한대기열에 없습니다. 하지만 여전히 컨텍스트가 필요하므로 파일 이름만으로는 허용되지 않습니다.
답변1
grep에 인수를 전달한 다음 출력을 $COLUMNS(또는 COLUMNS가 설정되지 않은 경우 80)로 자르는 다음 래퍼 함수를 고려해 보세요.
function grepcut() {
grep "$@" | cut -c1-${COLUMNS:-80}
}
다음과 같이 사용하세요:
$ grepcut sometext somefiles
또는
$ set | grepcut LS_COLORS
답변2
이는 원하는 결과를 제공하는 보다 정교한 접근 방식입니다. 일반적으로 간단한 문자열(정규식 특수 문자 없음)을 검색하고 옵션을 사용하지 않는 경우(또는 최소한 동일한 옵션을 사용하는 경우) 가장 잘 작동합니다.모든시간). 내 greptrim
스크립트:
#!/bin/bash
case "$1" in
("")
echo "Usage: $0 string [files...]"
exit 2
;;
(-*)
echo "This script can't take options."
exit 2
;;
esac
read rows cols <<< $(stty size)
if [ "$cols" = "" ]
then
cols=80
fi
margin=$(( (cols-${#1}) / 2 ))
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}"
- 준비: 비어 있지 않은 문자열(패턴) 매개변수가 있는지, 옵션이 아닌지 확인하세요.
- 그런 다음 다른 방법을 사용하여 열 수를 얻습니다. 1
- 화면 너비(열 수)에서 문자열 인수( )의 너비를 빼고
${#1}
2로 나눕니다. 이렇게 하면 문자열의 왼쪽과 오른쪽에 포함될 수 있는 문자 수가 계산되어 여전히 행에 맞습니다. , 80열 화면의 경우 10자로 구성된 문자열은margin
35입니다(35+10+35=80이므로). - 최종 순서는 약간 비슷해 보이지만
grep -o "$@"
우리는 그렇습니다grep -o "$1" "${@:2}"
."${@:2}"
는 bashism, 즉 의미이지만 (어떤 것이든)에서 시작됩니다"$@"
.$2
- 예를 들어 앞면과 뒷면
$1
으로 포장합니다 . 이는 최대 35개의 문자와 일치하므로 패턴은 원래 패턴을 가운데에 두고 총 최대 80개의 문자와 일치합니다..\{,$margin\}
.\{,35\}
$1
-o
이는 일치하는 텍스트만 출력된다는 의미입니다. 따라서 한 줄에 최대 80자를 출력할 수 있습니다.
저는 다음 샘플 텍스트를 사용했습니다.
Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping, As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door— Only this and nothing more.”
다음은 80열 화면에서 실행되는 예입니다.
$ ./greptrim or raven.txt
r many a quaint and curious volume of forgotten lore—
ently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber d
oor— Only this and nothing more.”
이 구절에는 "또는"이라는 문자열이 6번 등장한다는 점에 유의하세요: "f또는받아","내가또는에", "해라또는", "방문하다또는", "하다또는” 및 “ 미터또는e". "액세스" 때문에 세 번째 입력 줄을 두 번 얻습니다.또는" 그리고 " 하다또는”의 간격이 39자 이상입니다.
추가 참고사항:
- 분명히 옵션을 처리하기 위해 스크립트를 확장할 수 있습니다. 어떤 인수가 패턴이고 어떤 인수가 파일 이름인지 파악하기가 까다로워집니다.
- 예를 들어 특정 옵션을 항상 사용하려면 스크립트의 명령
-i
에 해당 옵션을 추가하기만 하면 됩니다 .grep
- 더하면
-n
4~5를 빼야 합니다cols
. - 간단한 문자열보다 더 복잡한 패턴이 있는 스크립트를 사용할 수 있지만 짧은 정규 표현식이 긴 텍스트 세그먼트와 일치할 수 있기 때문에(또는 그 반대) 결과가 만족스럽지 않을 수 있습니다. 따라서 계산이
margin
잘못되고 모든 줄이 더 길어질 수 있습니다. (또는 그 이하) 80자 미만입니다. - 추가된 경우
-E
여백 정규식을.{,$margin}
(백슬래시 제거)로 변경해야 합니다. 선택적 기능은 마지막 줄을 다음으로 변경하는 것입니다.
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}" | grep --color=auto "$1"
검색 문자열 강조 표시:
"forget"의 "or"는 "gate"의 "or"와 정확히 동일하다는 점에 유의하세요. 이는 일반적으로
margin
줄의 시작 부분부터 시작하는 문자보다 더 많은 문자를 포함하는 문자열 에서 발생합니다.
________
1 나는 cols
이렇다 ( read rows cols <<< $(stty size)
)
- 다양한 접근법을 보여주고,
- Cygwin을 사용하고 있는데
tput
아직 설치도 안됐고,COLUMNS
설정도 안 됐거든요.
POSIX와 호환됩니다.