xargs로 파이프 된 printf로 출력 형식화


0

코드베이스에서 문자열의 발생을 검색 한 다음 형식이 지정된 출력을 파일 이름, 줄 번호 및 코드 lide로 가져옵니다. 출력의 첫 번째 줄에서 원하는대로 얻었지만 다음 줄은 원하는 형식을 잃습니다.

$ find src/ -name "*.js" | xargs grep --null -E -n 'filter\(|map\(' | xargs -0 printf "%-100s%-5s%-100s" > test.txt

결과는 다음과 같습니다. (전체 줄을 보려면 오른쪽으로 스크롤하십시오)

src/components/AppRouterSwitch.js                                                                   15:    return _Routes.map((route, index) => {
src/components/forms/UserEditForm/UserEditForm.js36:    const options = UserTypes.map((type, index) => <option key={index} value={type.type}>{type.name}</option>);
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js119:        templates:state.templates.filter(item=>item.SOLUTIONID ==id)
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js120:            .map(item=>{return{

첫 번째 줄은 내가 원하는 것처럼 보입니다. 다음은 원하는 형식을 잃습니다. printf 형식 문자열을 끝내면 /n속임수가 없습니다.


1
grep의 표준 옵션 -l(소문자 L)을 사용하십시오
malyy

1
@malyy 나는 약간의 변형으로 시도했지만 성공하지 못했습니다. -l 옵션이 어떻게 도움이되는지 모르겠습니다. -l, --files-with-matches 정상 출력을 억제합니다. 대신 출력이 정상적으로 인쇄 될 각 입력 파일의 이름을 인쇄하십시오. 첫 번째 경기에서 스캔이 중지됩니다.
Max

내 대답을 확인하고 당신이 정말로 콜론을 원하는 경우 : 라인 번호 뒤에 (명확히하십시오
qubert

답변:


2
find src/ -type f -name '*.js' -exec grep -Hn -E -- 'filter\(|map\(' {} + |
    awk -F: '{printf "%-100s%-5s%-100s\n", $1, $2, substr($0, length($1) + length($2) + 3)}'

단일 파일을 인수로 호출하여 파일 이름을 인쇄하도록 하는 -H옵션 grep입니다. -type f찾을 수있는 옵션이 끊어진 링크 및 명명 할 일이 디렉토리를 생략하기 위해 필요하다 *.js.

또는 더 간단하게 grep을 완전히 제거하십시오 (제안을 위해 @don_crissti 덕분에).

find src/ -type f -name '*.js' -exec awk '/filter\(|map\(/{printf "%-100s%-5s%-100s\n", FILENAME, FNR, $0}' {} +

우아한 솔루션, 내가 필요한 것. 콜론은 필요하지 않습니다.
Max

0

man조금 불분명합니다. "첫 번째 일치시 스캔이 중지됩니다"-모든 파일 이름이 인쇄됨을 나타내지 만 일치하는 단어에 대한 스캔이 처음 발생하면 중지됩니다. GNU grep 매뉴얼 페이지에서이를 명확하게합니다.

-l
--files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning of each file stops on the first match. (-l is specified by POSIX.)

예를 들면 다음과 같습니다.

$grep -iR Intel * 
2018/jan/cpu.txt:Intel i9 
2018/motherboard.txt:Intel Motherboard 
hardware.txt:Intel Corei7
#the same result as you provided;

$grep -iRl Intel * 
2018/jan/cpu.txt
2018/motherboard.txt
hardware.txt
#the desired result

내가 원하는 것이 아닙니다. 출력을 오른쪽으로 스크롤하면 줄 번호와 코드 줄이 필요하지만 첫 번째 행과 같이 형식이 지정됩니다.
Max
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.