JSON 로그 파일이 있습니다 test.log
.
{"type":"1","fname":"AAA","lname":"bbb" }
{"type":"2","state":"gujarat" }
{"type":"3","city":"ahmedabad" }
{"type":"3","city":"rajkot" }
{"type":"1","fname":"ccc","lname":"ddd" }
다음 명령을 실행합니다.
cat test.log | jq -c "select(.type==\"1\")|{fname:.fname}" > type_1.txt
cat test.log | jq -c "select(.type==\"3\")|{city:.city}" > type_3.txt
단일 명령으로 jq
여러 출력 파일을 생성할 수 있나요?
파일에 대해 jq
명령을 한 번만 실행 test.log
하고 각 프로젝트 유형에 대해 하나의 출력 파일을 생성하고 싶습니다.
답변1
~에 따르면매뉴얼의 IO 부분버전 1.5부터 jq는 표준 출력에만 쓸 수 있고 디버그 메시지를 stderr
.
jq를 여러 번 실행 하고 싶지 않다면 test.log
(예: 대용량 파일이기 때문에) 다음과 같이 할 수 있습니다.
jq -c '(select(.type=="1") | {fname:.fname}), (select(.type=="3") | {city:.city})' test.log > temp
# The file 'temp' contains one entry per line.
grep '^{"fname"' temp > type_1.txt
grep '^{"city"' temp > type_3.txt
rm temp
답변2
를 사용하는 대신 jq
다른 JSON 인식 프로세서인 Miller( mlr
)를 사용하세요.
mlr --json put -q '
$type == 1 { emit >"type_1.txt", { "fname": $fname } }
$type == 3 { emit >"type_3.txt", { "city": $city } }' file
is 인 경우 fname
키와 파일에 해당하는 값이 포함된 JSON 개체를 인쇄하고 해당 키에 대한 항목도 처리합니다.type_1.txt
type
1
type
3
city
파일 type_1.txt
과 type_3.txt
존재하는 경우 이 명령이 새 데이터를 쓰기 전에 잘립니다(비어집니다).
예제를 실행하세요:
$ mlr --json put -q '$type == 1 { emit >"type_1.txt", { "fname": $fname } }; $type == 3 { emit >"type_3.txt", { "city": $city } }' file
$ cat type_1.txt
{ "fname": "AAA" }
{ "fname": "ccc" }
$ cat type_3.txt
{ "city": "ahmedabad" }
{ "city": "rajkot" }
답변3
jq
stdout(또는 stderr)만 기록되므로 스트림을 다른 로그 파일로 분할하려면 다른 프로그램이 필요합니다.
먼저 js
@nwk의 명령으로 로그 파일 필드 강화를 사용합니다.
jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
(select(.type=="3") | {"logfile":.type},{city:.city})' test.log
이 출력을 파이프로 연결하면 awk
파일 이름을 얻을 수 있습니다.
jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
(select(.type=="3") | {"logfile":.type},{city:.city})' test.log |
awk -F"\"" 'BEGIN {FPAT="[^{}:\"]+" }
$1=="logfile" {lf="type_"$2".txt"; next}
{print >> lf}'
답변4
파티에 조금 늦었어요. 이 문제를 완전히 되돌릴 수 있습니다. 스크립트로 실행될 때 다른 파일에 쓰는 방법을 묻는 대신 다른 파일에 쓰는 출력을 jq
생성할 수 있습니다 .jq
예는 다음과 같습니다.
jq -r \
$' recurse( .children[] ) |
select( (.type="comment") and (.text != null) ) |
"echo \'" + .text + "\' >> " + .author + ".txt" ' < file.json
실행하면 다음과 같은 출력이 생성됩니다.
echo '<p>Nice! Definitely let me know.</p>' >> user_1.txt
echo '<p>I agree.</p>' >> user_2.txt
그런 다음 이 출력을 스크립트로 실행하여 별도의 파일을 생성할 수 있습니다. jq
현재 셸 이외의 종속성도 없고 파이프도 없으며 추가 도구도 필요하지 않습니다. $'
접두사와 '
접미사는 명령문 \'
내에서 이스케이프될 수 있습니다 echo
.