xargs -I {}에서 줄바꿈을 유지하는 방법

xargs -I {}에서 줄바꿈을 유지하는 방법

다음은 수십 줄을 변수로 추출하지만 어떻게든 모두 한 줄에 배치합니다. 즉, 원래 줄바꿈이 손실됩니다.

ALL_FOUND_LINES=$(find "$TEMP" -type f -name "debug.log*" | xargs -I {} grep -F "STARTING HOST " {})

위와 같은 명령문에서 개행 문자를 보존하는 방법이 있습니까?

답변1

이것을 테스트하는 경우

echo $ALL_FOUND_LINES

$ALL_FOUND_LINES글쎄요, 쉘이 공백, 탭 및 줄 바꿈(기본적으로)의 값을 단어로 분할한 다음 파일 이름 생성(와일드카드) 단어로 각각을 추가로 확장하기 때문에 모든 줄 바꿈이 사라진 것에 놀라지 않습니다 . 확장이 참조되지 않기 때문에 이 작업이 수행됩니다. 그런 다음 유틸리티는 echo한 줄에 인쇄된 단어 목록을 가져옵니다.

더 나은 테스트는

printf '%s\n' "$ALL_FOUND_LINES"

변수 확장에 대한 참고 사항을 참고하세요. printf이상의 옵션은 다음 echo을 참조하세요.왜 printf가 echo보다 나은가요?.


귀하의 명령은 다음과 같이 향상될 수 있습니다.

find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} +

xargs여기서는 파일 이름을 에 전달하는 대신 find가능한 한 많은 파일을 한 번에 직접 실행합니다. 이를 제거해도 개행 문제는 해결되지 않습니다. 개행 문제와 아무 관련이 없기 때문입니다. 이렇게 하면 작업 속도가 빨라집니다. .grepdebug.log*xargsxargsgrep

당신은 또한 볼 수 있습니다"find"의 -exec 옵션 이해.

발견된 각 행에 대해 일부 작업을 수행해야 하는 경우 다음과 같이 반복할 수 있습니다.

find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} + |
while IFS= read -r line; do
    # use "$line" here (with quotes)
done

(또는 수행해야 하는 다른 처리 단계로 while 루프를 대체합니다.) 따라서 모든 데이터를 변수에 줄바꿈으로 구분된 문자열로 저장할 필요가 없습니다.

당신은 또한 볼 수 있습니다"IFS=read-r-line" 이해

답변2

manxargs

   -L max-lines
          Use at most max-lines nonblank input  lines  per  command  line.
          Trailing blanks cause an input line to be logically continued on
          the next input line.  Implies -x.

   -l[max-lines], --max-lines[=max-lines]
          Synonym for the -L option.  Unlike -L, the max-lines argument is
          optional.   If  max-lines  is not specified, it defaults to one.
          The -l option is deprecated since the POSIX  standard  specifies
          -L instead.

관련 정보