디렉토리의 파일에서 가장 긴 줄을 인쇄하는 한 줄 명령이 있습니까?

디렉토리의 파일에서 가장 긴 줄을 인쇄하는 한 줄 명령이 있습니까?

내가 파일이 많은 디렉토리에 있다고 가정해 보겠습니다. 디렉토리에 있는 모든 파일의 내용을 검색하고 "ER" 문자열은 포함하지만 "Cheese"는 포함하지 않는 가장 긴 줄을 표시하려면 어떻게 해야 합니까?

내가 알 수 있는 한, 나는 한 줄 명령으로 이 작업을 수행하려고 합니다.

디렉터리에 있는 모든 파일을 검색하려면 grep -r을 반복적으로 사용해야 한다고 생각하는데, 최종 목표는 가장 긴 줄만 표시하는 것이므로 지금까지는 다음과 같아야 한다고 생각합니다.

grep -r -e "ER" 

작은 희망에서 -v "cheese"를 추가하면 물론 작동하지 않습니다.

단 한 줄의 명령으로 이것이 가능하지 않습니까? 그렇다면 여러 줄에서 무엇을 해야 합니까?

답변1

다음은 awk 솔루션입니다.

 awk '/ER/ && !/Cheese/ {if (length($0) > maxlen) { maxline=$0; maxlen=length($0);}} END {print maxlen, maxline;}' *

(가장 긴 줄의 길이도 출력하는데, 그렇게 하고 싶지 않다면 그냥 ... END {print maxline;}.

Jeremy Dover의 grep 솔루션에 비해 장점은 입력을 한 번만 전달한다는 것입니다. 단점은 최대 길이가 동일한 여러 줄이 있는 경우 첫 번째 줄만 인쇄된다는 것입니다(또는 길이를 비교하기 위해 >=를 사용하는 경우 마지막 줄). grep 솔루션은 모든 줄을 인쇄합니다.

답변2

이 줄은 원하는 작업을 수행합니다(디렉토리의 파일에 대해).

awk '{l=length($0)}/ER/&&!/Cheese/&&(length($0)>l){l=length($0);line=$0}END{print(line)}' *

여러 줄이 일치하는 경우에만 인쇄첫 번째ER(치즈 아님)을 포함하고 이전에 선택한 행보다 긴 행입니다.

또한 pwd(*)의 파일을 검사합니다. 재귀가 필요한 경우 find 명령을 사용하여 파일을 선택해야 합니다.

find . -type f -iname '*.sh' -exec sh -c 'awk '\''{l=length($0)}/ER/&&!/Cheese/&&(l>lm){lm=l;li=$0}END{print(li)}'\'' "$@"' awksh {} +

또는 여러 줄로 작성(가독성을 위해):

find . -type f -iname '*.sh' -exec sh -c '\
awk '\''{l=length($0)}/ER/&&!/Cheese/&&(l>lm){lm=l;li=$0}END{print(li)}'\'\
' "$@"' awksh {} +

답변3

awk '/ER/ && !/Cheese/ && length > m {
       m=length; d=$0; f=substr(FILENAME, 3); n=FNR
     }
     END { print m, f ":" n, d }' ./*

현재 디렉터리에 일반 파일만 있다고 가정하면 m질문( )의 조건을 충족하는 가장 긴 줄의 길이와 파일 이름( f), 줄 번호( n) 및 d파일이 있는 줄 자체( ) 가 인쇄됩니다. 발견.

출력은 다음과 같습니다.

8 file:3 Hello ER

가장 긴 줄은 8자이며 파일 이름의 3번째 줄에서 찾을 수 있습니다 file.

답변4

앞에 문자열의 길이를 더하고 숫자로 정렬한 다음 첫 번째 결과의 두 번째 필드를 인쇄하여 원래 문자열을 가져옵니다.

 grep -h ER * | grep -v Cheese | awk '{ print length($0) " " $0}' | sort -nr| head -1| awk '{print $2}'    

이 방법을 사용하면 필요한 경우 "MAX" 또는 "MIN"보다 더 복잡한 쿼리를 수행할 수 있습니다. AWK 사용에 주의하세요. 그것이 진정한 이점입니다.

관련 정보