줄 길이로 텍스트 파일을 필터링하는 Linux 쉘 명령


19

dd if=/dev/sda1 of=diskimage텍스트 파일을 복구 해야하는 borked 파티션 (생각 ) 의 30GB 디스크 이미지가 있습니다. 데이터 조각 도구 foremost는 잘 정의 된 헤더가있는 파일, 즉 일반 텍스트 파일이 아닌 파일에서만 작동하므로 좋은 친구가되었습니다 strings.

strings diskimage > diskstrings.txt 실제로 쓸모없는 텍스트와 혼합 된 많은 문자열, 주로 쓸모없는 것들을 포함하는 3GB 텍스트 파일을 생성했습니다.

부스러기의 대부분은 실제로 길고 깨지지 않는 끈으로 묶인 경향이 있습니다. 내가 관심있는 것은 16kb보다 작다는 것이 보장되므로 파일을 줄 길이별로 필터링 할 것입니다. 내가 사용하는 파이썬 스크립트는 다음과 같습니다.

infile  = open ("infile.txt" ,"r");
outfile = open ("outfile.txt","w");
for line in infile:
    if len(line) < 16384:
        outfile.write(line)
infile.close()
outfile.close()

이것은 작동하지만 나중에 참조 할 수 있습니다 : 줄 길이로 파일을 필터링하는 마법의 한 줄 주문 (think awk, sed)이 있습니까?

답변:


28
awk '{ if (length($0) < 16384) print }' yourfile >your_output_file.txt

자신의 예와 같이 16 킬로바이트보다 짧은 줄을 인쇄합니다.

또는 Perl을 좋아한다면 :

perl -nle 'if (length($_) < 16384) { print }' yourfile >your_output_file.txt

글쎄, 그건 당황스럽게 간단했다. 감사합니다. :)
Li-aung Yip

:-) 펄 버전도 추가
의 Janne Pikkarainen

awk 'length($0) < 16384' file > output기본 조치는 행을 인쇄하는 것이므로 awk 스크립트는로 작성할 수 있습니다 .
glenn jackman

8

이것은 Ansgar의 답변과 비슷하지만 테스트에서 약간 더 빠릅니다.

awk 'length($0) < 16384' infile >outfile

다른 awk 답변과 같은 속도입니다. 그것은 print진정한 표현 의 내재 에 의존 하지만 Ansgar와 같이 줄을 나누기 위해 시간을 할애 할 필요는 없습니다.

AWK는 if무료로 제공합니다 . 위의 명령은 다음과 같습니다.

awk 'length($0) < 16384 {print}' infile >outfile

if다른 답변에서와 같이 명시 적 (또는 주변 중괄호 세트)이 없습니다 .

방법은 다음과 같습니다 sed.

sed '/.\{16384\}/d' infile >outfile

또는:

sed -r '/.{16384}/d' infile >outfile

16384 개 이상의 문자가 포함 된 행을 삭제합니다.

완전성 sed을 위해 다음은 임계 값보다 긴 라인을 저장 하는 방법입니다 .

sed '/^.\{0,16383\}$/d' infile >outfile

2

당신은 다음 awk과 같이 할 수 있습니다 :

$ awk '{ if (length($0) < 16384) { print } }' /path/to/text/file

16K 문자보다 긴 줄을 인쇄합니다 (16 * 1024).

당신은 grep또한 사용할 수 있습니다 :

$ grep ".\{,16384\}" /path/to/text/file

최대 16K 문자를 인쇄합니다.


확실하지 않은 것은 grep좋은 생각 awk입니다. 확실한 정규 표현식이지만 확실하게 계산 비용이 많이 듭니다 . "문제가있는 사람은"정규 표현을 사용하겠습니다! "라고 말합니다. 이제 두 가지 문제가 있습니다." ;)
Li-aung Yip

그것은 또 다른 방법입니다. 내가 게시 한 첫 번째 옵션은을 사용하는 것 awk입니다.
Khaled

1
그것은 더 나은 골프, 그리고 그것은 나를 awk 맨 페이지 =) 읽을 수 없습니다 때문에 정규식 +1
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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