2017-11-24 6 views
1

예를 들어 파일 목록이 있습니다. Grep 지정한 문자열을 포함하고 파일 이름 및 원하는 데이터로 출력되는 파일 목록입니다.

user1.txt 
user2805927.txt 
admin.txt 

각 파일에

이 같은 일부 datas 있습니다

unwanted data line1 
unwanted data line2 
unwanted data line n 

Usage · 220 
other lines that I don't need 

는 그리고 "220"단지 수를 싶어하고 각 파일에 문제의

한 다른 , · ALT CODE + 250 나는 퍼티에 쓸 수 없다.

출력 파일 이름 + 데이터를 얻을 수있는 방법이 있습니까 :

users1.txt | 220 
user2805927.txt | 85 
admin.txt | 18 
+0

방법에 대한 Usage' 후 후가 아닌 모든 숫자를 건너 뛰고 마지막을 포착'발견 정규식을하고 번호? –

+0

'grep -o ...'를 사용하십시오. 그럴 필요가 있습니다. – Dominique

+0

@ PM77-1 예, 조건은 이전에 'Usage'문자열이 있지만이 기호 ALT + 250이 나를 허용하지 않습니다. –

답변

1
임의의 문자 코드에 대한 당신 grep

(예외의 몇 - 0과 255은 GNU grep에서 내부적으로 사용된다).

xargs grep -o $'\xfa.*' -m 1 <filenames.txt 

배쉬 "C-스타일"문자열 $'...'는 (250 진수에 해당) 헥스 문자 코드를 \xfa를 사용하고 만 경기가 아닌 전체 라인을 인쇄에 grep -o 말한다 수 있습니다. -m 1으로 여러 파일이있을 경우 각 파일의 첫 번째 일치로 제한됩니다. xargsgrep을 파일의 파일 이름으로 명령 줄 인수로 실행한다고 말합니다. 이로 인해 grep은 각 일치 항목 앞에 파일 이름을 인쇄합니다.

users1.txt:· 220 
user2805927.txt:· 85 
admin.txt:· 18 

이 출력을 연습으로 남겨 둡니다. (당신이 grep -P이있는 경우 쉽게 경기에서 제외하기 위해 16 진수 코드 후 \\K를 넣을 수 있습니다.) 여기

sed 변화입니다 :

xargs -n 1 -i sed -n '/^Usage [^0-9]*/!d;s//{} | /p;q' {} <filenames.txt 

현재 라인은 정규 표현식과 일치하지 않는 경우 , 그것을 삭제하고 다음 라인으로 다시 시작하십시오. 그렇지 않으면 일치 항목을 현재 파일 이름 (xargs -i)으로 대체하고 파일 이름을 {}으로 바꾼 다음 줄을 인쇄 한 다음 현재 파일 처리를 종료합니다. xargs -n 1 각 파일 이름에 대한 sed 명령의 새로운 호출을 실행 말한다 (이 어쨌든 어쨌든 그렇게 암시 -i에 필요하지만.)

+0

나는 당신이 보는 캐릭터가 실제 캐릭터 코드 250을 가지고 있지 않다는 사실을 비밀리에 추측합니다. 현대 시스템에서는 아마도 UTF-8로 인코딩 된 유니 코드 문자 일 것입니다. 이 대답을 적용하는 것은 이것이 실제로 무엇을 의미하는지 실제로 이해하면 너무 어렵지 않습니다. 그렇지 않다면이 상자는 설명하기에 너무 작습니다. – tripleee

+0

또는'grep -P -o -m 1 '^ Usage \ s + [^ \ s \ d] + \ s + \ K \ d +''정확한 문자 코드를 걱정할 필요가 없습니다. 'grep -P'가 없으면'sed'와 동일합니다. – tripleee