로그 파일의 긴 줄 줄이기

로그 파일의 긴 줄 줄이기

프로그램 출력의 로그 파일을 저장합니다. 문제는 보관하고 싶지 않은 매우 긴 줄의 7비트 ASCII 데이터(인코딩된 바이너리)를 덤프할 때 오류가 발생하는 경우가 있다는 것입니다. 개행 문자에 도달하기 전까지 줄의 길이는 200KB를 넘을 수 있습니다.

짧고 파이프 가능한 방법은 무엇입니까? sed줄의 처음 80자와 마지막 40자만 유지하여 250자를 초과하는 줄만 변경합니다 ._?

답변1

sed에서 모든 명령에는 해당 명령이 적용되는 행을 나타내는 조건이 접두어로 붙을 수 있습니다. 일반적인 조건 중 하나는 검색 패턴입니다. 검색 패턴은 /.\{250\}/250자가 넘는 문자를 포함하는 줄과 일치합니다. 이러한 줄의 경우 처음 80자와 마지막 40자를 일치시키고 __전체 줄을 접두사와 접미사로 바꿉니다.

sed -e '/.\{250\}/ s/^\(.\{80\}\).*\(.\{40\}\)$/\1__\2/'

충분히 긴 줄만 일치하도록 대체 명령의 패턴을 정렬할 수도 있습니다.

sed -e 's/^\(.\{80\}\).\{130,\}\(.\{40\}\)$//'

답변2

나는 그것에 대해 많이 알지 못하므로 sed내 솔루션은 이상합니다.

awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file

답변3

다음은 이를 수행할 수 있는 awk 명령입니다.

awk 'len=length{if(len>250){print substr($0,0,80),"__",substr($0,len-40,len)}else{print $0}}' data.txt

설명하다:

줄이 250자를 초과하면 처음 80자를 인쇄하고 그 뒤에 문자열이 옵니다.___그런 다음 마지막 40자가 나옵니다.

줄이 250자 미만인 경우 원래 줄을 인쇄하면 됩니다.

답변4

한 줄의 처음 80자와 마지막 40자를 추출하는 파이프라인 방법이 있지만 "if 문"이 없으므로 sed에서 문자열 길이를 직접 테스트한 다음 이에 대한 작업을 수행할 수 없습니다 sed.sed

처음 80자와 마지막 40자를 캡처하세요.모두완성을 위해 라인을 사용할 수 있습니다 | sed -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/'.

sed -i -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/' logfile

내부 수정은 파일에 대해 수행되지만 모든 행에서만 수행됩니다.

관련 정보