OpenStack Swift 계정을 구문 분석하기 위해 While Read Line 상태를 사용하고 있습니다. 다음은 특정 생성/수정 날짜가 있는 모든 데이터를 찾는 데 사용하는 문의 일부 코드입니다.
먼저 다음 명령을 실행하여 계정의 모든 컨테이너 목록을 가져옵니다.
swift list -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> > containers.txt
이 명령은 아래와 같이 목록을 출력합니다.
ffd5eef3-2b75-4d4f-b30c-b9836b32a34c
컨테이너의 내용을 보기 위해 실행할 수 있는 명령은 다음과 같습니다.
swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> ffd5eef3-2b75-4d4f-b30c-b9836b32a34c
1507732 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FR.02
1812122 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FS.02
모든 컨테이너를 구문 분석하고 특정 날짜가 "2017-09-27"인 컨테이너의 모든 개체에 대해 경고하기 위해 다음 명령을 작성했습니다.
while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> $line | bash; done < containers.txt | awk '{ if ($2 == "2017-09-27") print $0}'
print $0 문에서 $line의 내용을 인쇄하는 방법이 있습니까? 예를 들어 출력은 다음과 유사합니다.
ffd5eef3-2b75-4d4f-b30c-b9836b32a34c 1812122 2017-09-27 19:55:57 application/octet-stream ffd5eef3-2b75-4d4f-b30c-b9836b32a34c.FS.02
편집하다:
나는 아직도 이 문제를 안고 있는데 지금은 그 이유를 모르겠습니다. "containers.txt" 파일에는 내 명령에 삽입되어 제대로 작동하는 컨테이너 목록(파일 또는 개체의 루트)이 있습니다. AWK 문에서 동일한 GUID를 인쇄할 수 없는 것 같습니다. 이는 AWK 문에 표시된 파일의 루트 디렉터리를 찾을 수 있도록 필요합니다. 다음 두 문은 정확히 동일한 출력을 생성합니다.
while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U auto02 -K [ACCOUNT PASSWORD] $line | bash; done < containers2.txt | awk -v l="$line" '$2 == "2018-05-08" { print l, $0 }'
while read line; do echo -e swift list -l -A http://sslabapi/auth/v1.0 -U auto02 -K [ACCOUNT PASSWORD] $line | bash; done < containers2.txt | awk '$2 == "2018-05-08" {print $0 }'
출력은 다음과 같습니다: 9923 2018-05-08 15:56:34 application/octet-stream 4919d1c8-f5c7-448f-98ad-29d88f1a5a84.BC.01
이상적으로는 다음과 같이 빌드 및 출력에 루트 컨테이너를 사용하고 싶습니다.
4919d1c8-f5c7-448f-98ad-29d88f1a5a84 9923 2018-05-08 15:56:34 애플리케이션/옥텟스트림 4919d1c8-f5c7-448f-98ad-29d88f1a5a84.BC.01
답변1
당신은해야합니다awk
~에while
외부에서 파이프를 통해 들어오는 대신 루프를 사용하세요 . 그 시점에서 루프 변수는 범위를 벗어났습니다(그리고 어떤 경우에도 여러 가지 다른 값을 취하므로 어떤 값을 보고 싶습니까?).
다음과 같이 하면 괜찮을 것입니다.
while read line
do
swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> "$line" | awk -v line="$line" '{ if ($2 == "2017-09-27") print line $0}'
done < containers.txt
나는 그들이 아무것도 달성하지 못했기 때문에 제거 echo
했습니다 . | bash
이는 하나가 아닌 여러 프로세스를 시작한다는 의미 awk
이지만 여기서는 문제가 되지 않습니다.
원하는 경우 루프 내부의 라인과 데이터를 연결할 수도 있습니다.
swift list -l -A http://sslabapi/auth/v1.0 -U qa04 -K <Account Password> "$line" | xargs -L 1 echo "$line"
이것xargs -L 1
명령은 해당 명령의 echo "$line" ABC
모든 출력 행 에 대해 ABC
실행 되며 swift list
각 행 앞에 추가되는 효과가 있습니다 $line
. 그런 다음 awk
외부에서 기존 장치 로 파이프하여 $3
대신 테스트를 조정하여 $2
보상할 수 있습니다.
이들 중 어느 것이 더 잘 작동하는지는 최종 목표가 무엇인지, 데이터가 어떻게 배포되는지에 따라 다르지만 여기서는 둘 다 동일합니다. 저는 개인적으로 두 번째 버전을 선호하지만 그건 중요하지 않습니다.
답변2
이 시도awk
awk -v l=$line '{if ($2 == "2017-09-27") print l" "$0}'
내 테스트 샘플:
# echo $line
abc
# cat tt.txt
hi 2017-09-27 test1
hi 2017-09-28 test1
# awk -v l=$line '{ if ($2 == "2017-09-27") print l" "$0}' tt.txt
abc hi 2017-09-27 test1