클라이언트로부터 받은 .zip 파일을 처리하는 스크립트를 작성 중입니다. 작업을 하다 보면 수신된 .zip 파일의 내용을 확인 수단으로 로그 파일에 나열하고 싶은 경우가 많습니다. 테스트 파일에서 파일 목록을 추출하여 로그 파일에 파일 목록을 삽입할 수 있었습니다.
이제 로그 파일에서 추출된 파일 이름 앞에 줄 바꿈과 탭을 추가하여 로그 파일을 정리하려고 합니다. 나는 가장 가까이에 있었다댓글을 달았습니다.아래 예에서는 한 줄의 출력에만 탭을 추가합니다. 다음에는 SED 사용을 고려했지만, SED에 대한 지식이 부족하여 로그 파일에 빈 줄만 표시되었습니다...
log_message "-------- Extracting files"
zipflist="`unzip -Z1 $file`"
log_message "Files found in received zip file..."
# log_message $'\n\t\t\t'"$zipflist"
log_message `sed '1 s/^/$'\t'"$zipflist"/' `
"log_message" 함수는 날짜/시간이 앞에 붙은 문자열을 파일에 전달합니다.
이것은 내가 지금까지 얻은 최고의 결과입니다.
2023-12-29 09:31:44: Files found in received zip file...
2023-12-29 09:31:44:
loremipsum.pdf
loremipsum.txt
dummy_report.xml
출력이 다음과 같기를 원합니다.
2023-12-29 09:31:44: Files found in received zip file...
2023-12-29 09:31:44:
loremipsum.pdf
loremipsum.txt
dummy_report.xml
RHEL의 SED, tr 또는 기타 기본 유틸리티를 사용하여 이를 수행할 수 있는 방법이 있습니까? 회사에서 승인하지 않은 것은 설치할 수 없으므로 가지고 있는 것을 사용하는 것을 선호합니다. (승인의 수고를 덜어드립니다)
답변1
% str=$'foo\nbar\ndoo\n'
% printf "%s" "$str" |sed -e $'s/^/\t/'
foo
bar
doo
(목록으로 다른 작업을 수행할 계획이 없다면 unzip | sed
var를 사용하지 않고 직접 수행할 수 있습니다.)
답변2
Bash 쉘에서는 요소로 저장된 행을 사용하여 이 작업을 수행할 수 있습니다.대량으로변수는 다음과 같습니다. 먼저 zipinfo
출력을 문자열 스칼라 변수 대신 쉘 배열로 읽은 다음 ${parameter/pattern/string}
매개변수 확장 배열 형식을 사용하여 각 요소의 접두사가 붙습니다.
예를 들어, 간단한 로그 함수가 주어지면
log_message() { printf '%s\n' "$@"; }
그 다음에
readarray -t zipflist < <(unzip -Z1 "$file")
log_message "${zipflist[@]/#/$'\t'}"
답변3
"여기에 문자열"을 사용할 수 있습니다.
sed -e $'s/^/\t\t\t/' <<< "$zipflist"
이는 파일 목록(개행 문자로 구분)이 이미 쉘 변수에 있는 경우에 적합합니다.
그러나 이를 명령에서 쉘 변수에 넣기 때문에 원래 명령에서 직접 형식을 지정하는 것이 더 좋습니다.
zipflist="$(unzip -Z1 "$file" | sed $'s/^/\t\t\t/')"
그러면 직면하게 될 문제는 첫 번째 행이 정렬되지 않는다는 것입니다. 다음과 같이 앞에 개행 문자를 추가하여 이를 처리할 수 있습니다.
log_message "-------- Extracting files"
zipflist="$(unzip -Z1 "$file" | sed -e $'1i\\\n' -e $'s/^/\t\t\t/g')"
log_message "$zipflist"
그러면 질문에 표시한 원하는 결과가 정확히 생성됩니다.
log_message
추가 설명: 이 명령이 무엇인지 궁금합니다 . 일반적으로 로그 도우미 함수의 논리를 정리하여 콘텐츠를 직접 전달할 수 있고 적절하게 처리하도록 하고 로그가 일반적으로 하는 것처럼 각 입력 줄 앞에 타임스탬프를 추가하는 것이 더 나을 수 있습니다. Linux 시스템이라면 logger
이와 같은 공백을 조작할 필요 없이 이 명령을 사용할 수 있습니다. logger
기본적으로 시스템 로그가 기록되지만 해당 섹션을 끄고 표준 오류를 사용할 수도 있습니다.
좋은 후속 질문은 다음과 같을 수 있습니다. "현재 타임스탬프를 스크립트 출력의 각 줄 앞에 추가할 수 있는 깔끔하고 빠른 방법이 있습니까?" 곧장 .)