개발자를 위한
jc
Python 패키지 문서를 확인하세요.
jc
웹 데모 및 REST API를 사용해 보세요.
jc
community.general
컬렉션에서 Ansible 필터 플러그인으로 제공됩니다. 예를 보려면 이 블로그 게시물을 참조하세요.
JSON 변환
jc
JSON은 스크립트에서 더 쉽게 구문 분석할 수 있도록 다양한 CLI 도구, 파일 유형 및 일반 문자열의 출력을 변환합니다. 지원되는 명령, 파일 유형 및 문자열은 파서 섹션을 참조하세요.
dig example.com | jc --dig
[{ "id" : 38052 , "opcode" : " QUERY " , "status" : " NOERROR " , "flags" :[ " qr " , " rd " , " ra " ],
"query_num" : 1 , "answer_num" : 1 , "authority_num" : 0 , "additional_num" : 1 ,
"opt_pseudosection" :{ "edns" :{ "version" : 0 , "flags" :[], "udp" : 4096 }}, "question" :
{ "name" : " example.com. " , "class" : " IN " , "type" : " A " }, "answer" :[{ "name" :
" example.com. " , "class" : " IN " , "type" : " A " , "ttl" : 39049 , "data" : " 93.184.216.34 " }],
"query_time" : 49 , "server" : " 2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1) " ,
"when" : " Fri Apr 16 16:09:00 PDT 2021 " , "rcvd" : 56 , "when_epoch" : 1618614540 ,
"when_epoch_utc" : null }]
이를 통해 jq
또는 jello
와 같은 도구를 사용하여 명령을 파이핑하여 추가 명령줄 출력 처리가 가능해집니다.
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
또는 대체 "마법" 구문을 사용합니다.
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
Python 라이브러리로도 사용할 수 있습니다. 이 경우 반환되는 값은 Python 사전, 사전 목록 또는 JSON 대신 사전의 게으른 반복 가능입니다.
> >> import subprocess
> >> import jc
> >>
>> > cmd_output = subprocess . check_output ([ 'dig' , 'example.com' ], text = True )
> >> data = jc . parse ( 'dig' , cmd_output )
> >>
>> > data [ 0 ][ 'answer' ]
[{ 'name' : 'example.com.' , 'class' : 'IN' , 'type' : 'A' , 'ttl' : 29658 , 'data' :
'93.184.216.34' }]
jc
Python 패키지 설명서를 보려면help('jc')
,help('jc.lib')
사용하거나 온라인 설명서를 참조하세요.
데이터의 두 가지 표현을 사용할 수 있습니다. 기본 표현은 파서별로 엄격한 스키마를 사용하고 알려진 숫자를 int/float JSON 값으로 변환합니다. None
의 특정 알려진 값은 JSON null
로 변환되고, 알려진 부울 값은 변환되며, 경우에 따라 추가 의미 컨텍스트 필드가 추가됩니다.
사전 처리된 원시 JSON에 액세스하려면 jc
Python 라이브러리로 사용할 때 -r
cli 옵션을 사용하거나 parse()
에서 raw=True
함수 매개 변수를 사용하세요.
각 파서의 스키마는 아래 각 파서 옆의 문서 링크에서 찾을 수 있습니다.
릴리스 노트는 Github의 릴리스 섹션에서 찾을 수 있습니다.
이 프로젝트의 동기에 대한 자세한 내용은 Bringing the Unix Philosophy to the 21st Century에 대한 내 블로그 게시물과 Console과의 인터뷰를 참조하세요.
참조:
사용 사례:
jc
얻는 방법에는 여러 가지가 있습니다. pip
, OS 패키지 리포지토리를 통해 설치하거나 아키텍처에 맞는 바이너리를 다운로드하고 파일 시스템 어디에서나 실행하여 설치할 수 있습니다.
pip3 install jc
운영체제 | 명령 |
---|---|
데비안/우분투 리눅스 | apt-get install jc |
페도라 리눅스 | dnf install jc |
오픈수세 리눅스 | zypper install jc |
아치리눅스 | pacman -S jc |
닉스OS 리눅스 | nix-env -iA nixpkgs.jc 또는 nix-env -iA nixos.jc |
Guix 시스템 리눅스 | guix install jc |
젠투 리눅스 | emerge dev-python/jc |
포톤 리눅스 | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Ansible 필터 플러그인 | ansible-galaxy collection install community.general |
FortiSOAR 커넥터 | FortiSOAR 커넥터 마켓플레이스에서 설치 |
더 많은 OS 패키지를 보려면 https://repology.org/project/jc/versions를 참조하세요.
미리 컴파일된 바이너리에 대해서는 Github의 릴리스를 참조하세요.
jc
STDIN
에서 파이프된 입력을 받아들이고 이전 명령 출력의 JSON 표현을 STDOUT
으로 출력합니다.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
또는 변환할 명령 앞에 jc
추가하거나 Proc 파일의 절대 경로 앞에 "magic" 구문을 사용할 수 있습니다. 명령 또는 Proc 파일 경로가 제공되기 직전에 옵션을 jc
에 전달할 수 있습니다. (참고: 명령 별명 및 쉘 내장은 지원되지 않습니다)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
JSON 출력은 -p
옵션을 사용하여 간단하게(기본값) 포맷하거나 예쁜 형식으로 지정할 수 있습니다.
논쟁 | 명령 또는 파일 유형 | 선적 서류 비치 |
---|---|---|
--acpi | acpi 명령 파서 | 세부 |
--airport | airport -I 명령 파서 | 세부 |
--airport-s | airport -s 명령 파서 | 세부 |
--apt-cache-show | apt-cache show 명령 파서 | 세부 |
--apt-get-sqq | apt-get -sqq 명령 파서 | 세부 |
--arp | arp 명령 파서 | 세부 |
--asciitable | ASCII 및 유니코드 테이블 파서 | 세부 |
--asciitable-m | 여러 줄 ASCII 및 유니코드 테이블 파서 | 세부 |
--blkid | blkid 명령 파서 | 세부 |
--bluetoothctl | bluetoothctl 명령 파서 | 세부 |
--cbt | cbt (Google Bigtable) 명령 파서 | 세부 |
--cef | CEF 문자열 파서 | 세부 |
--cef-s | CEF 문자열 스트리밍 파서 | 세부 |
--certbot | certbot 명령 파서 | 세부 |
--chage | chage --list 명령 파서 | 세부 |
--cksum | cksum 및 sum 명령 파서 | 세부 |
--clf | 공통 및 결합 로그 형식 파일 파서 | 세부 |
--clf-s | 공통 및 결합 로그 형식 파일 스트리밍 파서 | 세부 |
--crontab | crontab 명령 및 파일 파서 | 세부 |
--crontab-u | 사용자 지원이 포함된 crontab 파일 파서 | 세부 |
--csv | CSV 파일 파서 | 세부 |
--csv-s | CSV 파일 스트리밍 파서 | 세부 |
--curl-head | curl --head 명령 파서 | 세부 |
--date | date 명령 파서 | 세부 |
--datetime-iso | ISO 8601 날짜/시간 문자열 파서 | 세부 |
--debconf-show | debconf-show 명령 파서 | 세부 |
--df | df 명령 파서 | 세부 |
--dig | dig 명령 파서 | 세부 |
--dir | dir 명령 파서 | 세부 |
--dmidecode | dmidecode 명령 파서 | 세부 |
--dpkg-l | dpkg -l 명령 파서 | 세부 |
--du | du 명령 파서 | 세부 |
--efibootmgr | efibootmgr 명령 파서 | 세부 |
--email-address | 이메일 주소 문자열 파서 | 세부 |
--env | env 명령 파서 | 세부 |
--ethtool | ethtool 명령 파서 | 세부 |
--file | file 명령 파서 | 세부 |
--find | 명령 파서 find | 세부 |
--findmnt | findmnt 명령 파서 | 세부 |
--finger | finger 명령 파서 | 세부 |
--free | free 명령 파서 | 세부 |
--fstab | /etc/fstab 파일 파서 | 세부 |
--git-log | git log 명령 파서 | 세부 |
--git-log-s | git log 명령 스트리밍 파서 | 세부 |
--git-ls-remote | git ls-remote 명령 파서 | 세부 |
--gpg | gpg --with-colons 명령 파서 | 세부 |
--group | /etc/group 파일 파서 | 세부 |
--gshadow | /etc/gshadow 파일 파서 | 세부 |
--hash | hash 명령 파서 | 세부 |
--hashsum | hashsum 명령 파서( md5sum , shasum 등) | 세부 |
--hciconfig | hciconfig 명령 파서 | 세부 |
--history | history 명령 파서 | 세부 |
--host | host 명령 파서 | 세부 |
--hosts | /etc/hosts 파일 파서 | 세부 |
--http-headers | HTTP 헤더 파서 | 세부 |
--id | id 명령 파서 | 세부 |
--ifconfig | ifconfig 명령 파서 | 세부 |
--ini | INI 파일 파서 | 세부 |
--ini-dup | 중복 키 파일 파서가 있는 INI | 세부 |
--iostat | iostat 명령 파서 | 세부 |
--iostat-s | iostat 명령 스트리밍 파서 | 세부 |
--ip-address | IPv4 및 IPv6 주소 문자열 파서 | 세부 |
--ipconfig | ipconfig Windows 명령 파서 | 세부 |
--iptables | iptables 명령 파서 | 세부 |
--ip-route | ip route 명령 파서 | 세부 |
--iw-scan | iw dev [device] scan 명령 파서 | 세부 |
--iwconfig | iwconfig 명령 파서 | 세부 |
--jar-manifest | Java MANIFEST.MF 파일 파서 | 세부 |
--jobs | jobs 명령 파서 | 세부 |
--jwt | JWT 문자열 파서 | 세부 |
--kv | 키/값 파일 및 문자열 파서 | 세부 |
--kv-dup | 중복 키 파일 및 문자열 파서가 있는 키/값 | 세부 |
--last | last 및 lastb 명령 파서 | 세부 |
--ls | ls 명령 파서 | 세부 |
--ls-s | ls 명령 스트리밍 파서 | 세부 |
--lsattr | lsattr 명령 구문 분석기 | 세부 |
--lsb-release | lsb_release 명령 파서 | 세부 |
--lsblk | lsblk 명령 파서 | 세부 |
--lsmod | lsmod 명령 파서 | 세부 |
--lsof | lsof 명령 파서 | 세부 |
--lspci | lspci -mmv 명령 파서 | 세부 |
--lsusb | lsusb 명령 파서 | 세부 |
--m3u | M3U 및 M3U8 파일 파서 | 세부 |
--mdadm | mdadm 명령 구문 분석기 | 세부 |
--mount | mount 명령 파서 | 세부 |
--mpstat | mpstat 명령 파서 | 세부 |
--mpstat-s | mpstat 명령 스트리밍 파서 | 세부 |
--needrestart | needrestart -b 명령 구문 분석기 | 세부 |
--netstat | netstat 명령 파서 | 세부 |
--nmcli | nmcli 명령 파서 | 세부 |
--nsd-control | nsd-control 명령 파서 | 세부 |
--ntpq | ntpq -p 명령 파서 | 세부 |
--openvpn | openvpn-status.log 파일 파서 | 세부 |
--os-prober | os-prober 명령 파서 | 세부 |
--os-release | /etc/os-release 파일 파서 | 세부 |
--pacman | pacman 명령 파서 | 세부 |
--passwd | /etc/passwd 파일 파서 | 세부 |
--path | POSIX 경로 문자열 파서 | 세부 |
--path-list | POSIX 경로 목록 문자열 파서 | 세부 |
--pci-ids | pci.ids 파일 파서 | 세부 |
--pgpass | PostgreSQL 비밀번호 파일 파서 | 세부 |
--pidstat | pidstat -H 명령 구문 분석기 | 세부 |
--pidstat-s | pidstat -H 명령 스트리밍 파서 | 세부 |
--ping | ping 및 ping6 명령 파서 | 세부 |
--ping-s | ping 및 ping6 명령 스트리밍 파서 | 세부 |
--pip-list | pip list 명령 파서 | 세부 |
--pip-show | pip show 명령 파서 | 세부 |
--pkg-index-apk | Alpine Linux 패키지 인덱스 파일 파서 | 세부 |
--pkg-index-deb | 데비안 패키지 색인 파일 파서 | 세부 |
--plist | PLIST 파일 파서 | 세부 |
--postconf | postconf -M 명령 구문 분석기 | 세부 |
--proc | /proc/ 파일 파서 | 세부 |
--ps | ps 명령 파서 | 세부 |
--resolve-conf | /etc/resolve.conf 파일 파서 | 세부 |
--route | route 명령 파서 | 세부 |
--rpm-qi | rpm -qi 명령 파서 | 세부 |
--rsync | rsync 명령 파서 | 세부 |
--rsync-s | rsync 명령 스트리밍 파서 | 세부 |
--semver | 의미론적 버전 문자열 파서 | 세부 |
--sfdisk | sfdisk 명령 파서 | 세부 |
--shadow | /etc/shadow 파일 파서 | 세부 |
--srt | SRT 파일 파서 | 세부 |
--ss | ss 명령 파서 | 세부 |
--ssh-conf | ssh 구성 파일 및 ssh -G 명령 파서 | 세부 |
--sshd-conf | sshd 구성 파일 및 sshd -T 명령 구문 분석기 | 세부 |
--stat | stat 명령 파서 | 세부 |
--stat-s | stat 명령 스트리밍 파서 | 세부 |
--swapon | swapon 명령 파서 | 세부 |
--sysctl | sysctl 명령 파서 | 세부 |
--syslog | Syslog RFC 5424 문자열 파서 | 세부 |
--syslog-s | Syslog RFC 5424 문자열 스트리밍 파서 | 세부 |
--syslog-bsd | Syslog RFC 3164 문자열 파서 | 세부 |
--syslog-bsd-s | Syslog RFC 3164 문자열 스트리밍 파서 | 세부 |
--systemctl | systemctl 명령 파서 | 세부 |
--systemctl-lj | systemctl list-jobs 명령 파서 | 세부 |
--systemctl-ls | systemctl list-sockets 명령 파서 | 세부 |
--systemctl-luf | systemctl list-unit-files 명령 파서 | 세부 |
--systeminfo | systeminfo 명령 파서 | 세부 |
--time | /usr/bin/time 명령 구문 분석기 | 세부 |
--timedatectl | timedatectl status 명령 구문 분석기 | 세부 |
--timestamp | Unix Epoch 타임스탬프 문자열 파서 | 세부 |
--toml | TOML 파일 파서 | 세부 |
--top | top -b 명령 파서 | 세부 |
--top-s | top -b 명령 스트리밍 파서 | 세부 |
--tracepath | tracepath 및 tracepath6 명령 구문 분석기 | 세부 |
--traceroute | traceroute 및 traceroute6 명령 파서 | 세부 |
--tune2fs | tune2fs -l 명령 파서 | 세부 |
--udevadm | udevadm info 명령 구문 분석기 | 세부 |
--ufw | ufw status 명령 파서 | 세부 |
--ufw-appinfo | ufw app info [application] 명령 파서 | 세부 |
--uname | uname -a 명령 구문 분석기 | 세부 |
--update-alt-gs | update-alternatives --get-selections 명령 파서 | 세부 |
--update-alt-q | update-alternatives --query 명령 구문 분석기 | 세부 |
--upower | upower 명령 파서 | 세부 |
--uptime | uptime 명령 파서 | 세부 |
--url | URL 문자열 파서 | 세부 |
--ver | 버전 문자열 파서 | 세부 |
--veracrypt | veracrypt 명령 파서 | 세부 |
--vmstat | vmstat 명령 파서 | 세부 |
--vmstat-s | vmstat 명령 스트리밍 파서 | 세부 |
--w | w 명령 파서 | 세부 |
--wc | wc 명령 파서 | 세부 |
--wg-show | wg show 명령 파서 | 세부 |
--who | who 파서를 명령하는가 | 세부 |
--x509-cert | X.509 PEM 및 DER 인증서 파일 파서 | 세부 |
--x509-csr | X.509 PEM 및 DER 인증서 요청 파일 파서 | 세부 |
--xml | XML 파일 파서 | 세부 |
--xrandr | xrandr 명령 파서 | 세부 |
--yaml | YAML 파일 파서 | 세부 |
--zipinfo | zipinfo 명령 파서 | 세부 |
--zpool-iostat | zpool iostat 명령 구문 분석기 | 세부 |
--zpool-status | zpool status 명령 구문 분석기 | 세부 |
짧은 | 긴 | 설명 |
---|---|---|
-a | --about | jc 소개. jc 및 파서에 대한 정보를 인쇄합니다(물론 JSON 또는 YAML로!). |
-C | --force-color | 파이프를 사용하는 경우에도 강제 색상 출력( -m 및 NO_COLOR env 변수 재정의) |
-d | --debug | 디버그 모드. 구문 분석 문제가 발생하면 추적 메시지를 인쇄합니다(자세한 디버깅을 위해 -dd 사용). |
-h | --help | 돕다. 파서 문서화에는 jc -h --parser_name 사용하십시오. 숨겨진 파서를 표시하려면 두 번 사용하십시오(예: -hh ). 파서 카테고리를 표시하려면 세 번 사용하세요(예: -hhh ). |
-m | --monochrome | 흑백 출력 |
-M | --meta-out | 타임스탬프, 파서 이름, 매직 명령, 매직 명령 종료 코드 등을 포함하여 출력에 메타데이터를 추가합니다. |
-p | --pretty | JSON 출력의 형식을 깔끔하게 지정하세요. |
-q | --quiet | 조용한 모드. 파서 경고 메시지를 억제합니다(스트리밍 파서 오류를 무시하려면 -qq 사용). |
-r | --raw | 원시 출력. 일반적으로 문자열 값을 사용하고 추가 의미 처리 없이 더 많은 리터럴 출력을 제공합니다. |
-s | --slurp | 여러 줄을 배열로 후루룩 마시세요. (호환되는 파서를 찾으려면 -hhh 사용하십시오) |
-u | --unbuffer | 언버퍼 출력 |
-v | --version | 버전 정보 |
-y | --yaml-out | YAML 출력 |
-B | --bash-comp | Bash 쉘 완성 스크립트 생성(추가 정보) |
-Z | --zsh-comp | Zsh 쉘 완성 스크립트 생성(추가 정보) |
라인 슬라이싱은 Python 슬라이싱과 유사한 START:STOP
구문을 사용하여 지원됩니다. 이를 통해 jc
변환하려는 STDIN
입력의 시작 및/또는 끝 부분에서 줄을 건너뛸 수 있습니다.
START
및 STOP
양수 또는 음수 정수이거나 공백일 수 있으며 건너뛸 줄 수와 처리할 줄 수를 지정할 수 있습니다. 양수 슬라이스와 빈 슬라이스는 메모리 효율성이 가장 높습니다. 슬라이스의 음수는 더 많은 메모리를 사용합니다.
예를 들어 다음 텍스트의 첫 번째 줄과 마지막 줄을 건너뛰려면 몇 가지 방법으로 조각을 표현할 수 있습니다.
$ cat table.txt
# ## We want to skip this header ###
col1 col2
foo 1
bar 2
# ## We want to skip this footer ###
$ cat table.txt | jc 1:-1 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
$ cat table.txt | jc 1:4 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
이 예에서는 1:-1
및 1:4
라인 슬라이스가 동일한 출력을 제공합니다.
양의 정수를 사용하는 경우 STOP
의 인덱스 위치는 포함되지 않습니다. 양수 슬라이스는 입력의 첫 번째 줄부터 첫 번째 줄인 0
부터 시작하여 끝까지 계산됩니다. 음수 슬라이스는 마지막 줄부터 -1
부터 시작하여 마지막 줄부터 시작하여 계산됩니다. 이는 Python의 슬라이싱 기능이 작동하는 방식이기도 합니다.
다음은 라인 슬라이스 옵션에 대한 분석입니다.
슬라이스 표기법 | 처리된 입력 라인 |
---|---|
START:STOP | 라인 START 부터 STOP - 1 |
START: | 라인은 나머지 출력을 통해 START . |
:STOP | 처음부터 STOP - 1 |
-START:STOP | 끝부터 STOP까지의 START 라인 STOP - 1 |
START:-STOP | 라인 START 부터 STOP 까지 라인 끝에서 |
-START:-STOP | 끝의 START 라인부터 끝의 STOP 라인까지 |
-START: | 끝부터 출력의 나머지 부분까지 START 라인 |
:-STOP | 처음부터 줄부터 끝까지 STOP 줄까지 |
: | 모든 라인 |
일부 파서는 다중 항목 입력을 지원하고 단일 패스로 결과 배열을 출력할 수 있습니다. Slurping은 한 줄의 입력을 허용하는 문자열 파서에서 작동합니다. (예: url
및 ip-address
) --slurp
옵션을 지원하는 파서 목록을 보려면 jc -hhh
사용하십시오.
예를 들어, --slurp
옵션을 사용하여 여러 IP 주소(한 줄에 하나씩)가 있는 파일을 jc
로 보낼 수 있으며 결과 배열이 출력됩니다.
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
/proc
파일의 매직 구문은 자동으로 여러 파일의 소리 제거를 지원합니다( --slurp
옵션을 사용할 필요 없음). 예를 들어, 한 번에 여러 PID 파일을 변환할 수 있습니다.
$ jc /proc/ * /status
[ < multiple output objects > ]
/proc
매직 구문을 사용하고 여러 파일을 선택한 경우 추가 _file
필드가 출력에 삽입되므로 각 출력 개체가 어떤 파일을 참조하는지 더 쉽게 알 수 있습니다.
마지막으로 --meta-out
옵션을 후루룩 출력과 함께 사용할 수 있습니다. 이 경우, 후루룩 소리가 나는 출력은 다음 구조의 객체로 래핑됩니다.
{
"result" : [ ],
"_jc_meta" : {
"parser" : " url " ,
"timestamp" : 1706235558.654576 ,
"slice_start" : null ,
"slice_end" : null ,
"input_list" : [
" http://www.google.com " ,
" https://www.apple.com " ,
" https://www.microsoft.com "
]
}
}
--meta-out
사용하면 input_list
입력 목록(실제 입력 문자열 또는 /proc
파일 이름)이 포함되므로 각 입력 문자열 또는 /proc
파일 이름과 관련된 출력 객체를 식별할 수 있습니다.
jc
내의 모든 치명적인 오류는 100
이라는 종료 코드를 생성합니다. 그렇지 않으면 종료 코드는 0
이 됩니다.
"마법의" 구문(예: jc ifconfig eth0
)을 사용할 때 jc
는 구문 분석 중인 프로그램의 종료 코드를 저장하고 이를 jc
종료 코드에 추가합니다. 이렇게 하면 오류가 구문 분석된 프로그램 또는 jc
에서 발생했는지 확인하는 것이 더 쉽습니다.
ifconfig
사용하여 다음 예를 고려하십시오.
ifconfig 종료 코드 | jc 종료 코드 | 결합된 종료 코드 | 해석 |
---|---|---|---|
0 | 0 | 0 | 오류 없음 |
1 | 0 | 1 | ifconfig 오류 |
0 | 100 | 100 | jc 에 오류가 있습니다. |
1 | 100 | 101 | ifconfig 와 jc 모두에서 오류가 발생했습니다. |
"magic" 구문을 사용할 때 --meta-out
또는 -M
옵션을 사용하여 호출된 프로그램의 종료 코드를 검색할 수도 있습니다. 그러면 종료 코드를 포함하여 마법 명령 정보가 포함된 출력에 _jc_meta
개체가 추가됩니다.
다음은 ping
의 예입니다.
$ jc --meta-out -p ping -c2 192.168.1.252
{
" destination_ip " : " 192.168.1.252 " ,
" data_bytes " : 56,
" pattern " : null,
" destination " : " 192.168.1.252 " ,
" packets_transmitted " : 2,
" packets_received " : 0,
" packet_loss_percent " : 100.0,
" duplicates " : 0,
" responses " : [
{
" type " : " timeout " ,
" icmp_seq " : 0,
" duplicate " : false
}
],
" _jc_meta " : {
" parser " : " ping " ,
" timestamp " : 1661357115.27949,
" magic_command " : [
" ping " ,
" -c2 " ,
" 192.168.1.252 "
],
" magic_command_exit " : 2
}
}
$ echo $?
2
JC_COLORS
환경 변수를 통해 사용자 정의 색상을 지정할 수 있습니다. JC_COLORS
환경 변수는 다음 형식의 쉼표로 구분된 4개의 문자열 값을 사용합니다.
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
색상은 다음과 같습니다: black
, red
, green
, yellow
, blue
, magenta
, cyan
, gray
, brightblack
, brightred
, brightgreen
, brightyellow
, brightblue
, brightmagenta
, brightcyan
, white
또는 default
예를 들어 기본 색상으로 설정하려면 다음을 수행하세요.
JC_COLORS=blue,brightblack,magenta,green
또는
JC_COLORS=default,default,default,default
NO_COLOR
환경 변수를 임의의 값으로 설정하여 jc
에서 색상 출력을 비활성화할 수 있습니다. 색상 출력을 강제하기 위해 -C
옵션을 사용하면 NO_COLOR
환경 변수와 -m
옵션이 모두 무시됩니다.
대부분의 파서는 STDIN
에서 모든 데이터를 로드하고 구문 분석한 다음 전체 JSON 문서를 직렬로 출력합니다. STDIN
에서 수신되는 동안 데이터를 JSON 라인(일명 NDJSON)으로 한 줄씩 처리하고 출력하는 즉시 시작하는 일부 스트리밍 파서(예: ls-s
및 ping-s
)가 있습니다. 이는 대량의 명령 출력(예: ls -lR /
)을 구문 분석하는 데 필요한 메모리 양을 크게 줄일 수 있으며 때로는 데이터를 더 빠르게 처리할 수 있습니다. 스트리밍 파서는 아래에 설명된 대로 표준 파서와 동작이 약간 다릅니다.
참고: 스트리밍 파서는 "magic" 구문과 함께 사용할 수 없습니다.
스트리밍 파서를 사용할 때 구문 분석 오류는 수명이 긴 처리 파이프라인에서 사용될 수 있고 오류로 인해 파이프가 손상될 수 있으므로 무시하는 것이 좋습니다. 구문 분석 오류를 무시하려면 -qq
cli 옵션을 사용하거나 parse()
함수와 함께 ignore_exceptions=True
인수를 사용하십시오. 그러면 success
속성과 함께 _jc_meta
객체가 JSON 출력에 추가됩니다. success
이 true
이면 행을 구문 분석하는 데 문제가 없는 것입니다. success
이 false
이면 구문 분석 문제가 발견되었으며 짧은 오류 설명과 구문 분석할 수 없는 행의 내용을 각각 포함하기 위해 error
및 line
필드가 추가됩니다.
-qq
옵션을 사용하여 행을 성공적으로 구문 분석했습니다.
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
-qq
옵션을 사용하여 라인을 성공적으로 구문 분석하지 못했습니다.
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
대부분의 운영 체제는 프로세스에서 프로세스로 파이프되는 출력을 버퍼링합니다. 버퍼는 일반적으로 약 4KB입니다. 터미널에서 출력을 볼 때 OS 버퍼가 사용되지 않으므로 출력이 화면에 즉시 표시됩니다. 그러나 여러 프로세스를 함께 파이핑할 때 입력 데이터가 매우 느릴 때(예: ping
) 출력이 중단된 것처럼 보일 수 있습니다.
$ ping 1.1.1.1 | jc --ping-s | jq
이는 이 예에서 OS가 jc
와 jq
사이에 4KB 버퍼를 사용하기 때문입니다. 터미널에 데이터를 실시간으로 표시하려면 -u
(unbuffer) cli 옵션을 사용하여 버퍼를 비활성화할 수 있습니다.
$ ping 1.1.1.1 | jc --ping-s -u | jq
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
...
참고: 대용량 데이터 스트림의 경우 버퍼링되지 않은 출력이 느려질 수 있습니다.
스트리밍 파서는 반복 가능한 모든 개체를 허용하고 데이터의 지연 처리를 허용하는 반복 가능한 개체를 반환합니다. 입력 데이터는 문자열 데이터 행에서 반복되어야 합니다. 좋은 입력 데이터의 예는 sys.stdin
또는 str.splitlines()
입니다.
반환된 반복 가능한 객체를 코드에서 사용하려면 간단히 반복하거나 next() 내장 함수를 사용하세요.
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
파서 플러그인은 로컬 "앱 데이터 디렉터리" 의 jc/jcparsers
폴더에 배치될 수 있습니다.
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
파서 플러그인은 표준 Python 모듈 파일입니다. jc/parsers/foo.py
또는 jc/parsers/foo_s.py (streaming)
파서를 템플릿으로 사용하고 jcparsers
하위 폴더에 .py
파일을 넣기만 하면 됩니다. 모든 종속성은 jcparsers
위의 jc
폴더에 배치할 수 있으며 파서 코드로 가져올 수 있습니다.
파서 플러그인 파일 이름은 유효한 Python 모듈 이름이어야 하므로 문자로 시작하고 전체가 영숫자와 밑줄로 구성되어야 합니다. 로컬 플러그인은 기본 파서를 무시할 수 있습니다.
참고: 애플리케이션 데이터 디렉터리는 XDG 기본 디렉터리 사양을 따릅니다.
최상의 결과를 얻으려면 LC_ALL
변수를 수정하여 로케일 환경 변수를 C
또는 en_US.UTF-8
로 설정하십시오.
$ LC_ALL=C date | jc --date
로캘 변수를 개별적으로 설정할 수도 있습니다.
$ export LANG=C
$ export LC_NUMERIC=C
일부 이전 시스템에서는 C
로캘이 UTF-8 인코딩을 지원하지 않는 경우 UTF-8 출력이 \u
이스케이프 시퀀스가 있는 ASCII로 다운그레이드됩니다.
일부 파서는 계산된 에포크 타임스탬프 필드를 출력에 추가했습니다. 타임스탬프 필드 이름에 _utc
접미사가 없으면 순진한 것으로 간주됩니다. (즉, jc
파서가 실행된 시스템의 현지 시간대를 기준으로 함).
명령 출력 텍스트에서 UTC 시간대가 감지될 수 있는 경우 타임스탬프는 시간대를 인식하며 키 이름에 _utc
접미사가 붙습니다. (예: epoch_utc
) 인식 타임스탬프에는 다른 시간대가 지원되지 않습니다.
jc
대부분의 모든 쉘에서 사용할 수 있습니다. 일부 최신 셸에는 JSON 역직렬화 및 필터링 기능이 내장되어 있어 jc
더욱 편리하게 사용할 수 있습니다.
예를 들어 NGS(Next Generation Shell)에서는 다음이 가능합니다.
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
이는 jc
실행하고, 출력 JSON을 구문 분석하고, 결과 데이터 구조를 한 줄의 코드로 변수에 할당합니다.
다른 쉘에서 jc
사용하는 방법에 대한 더 많은 예를 보려면 이 위키 페이지를 참조하세요.
dig
, xml
, csv
등과 같은 일부 파서는 모든 플랫폼에서 작동합니다. 플랫폼별 출력을 변환하는 다른 파서는 지원되지 않는 플랫폼에서 실행될 경우 경고 메시지를 생성합니다. 호환성을 포함한 모든 파서 정보를 보려면 jc -ap
실행하세요.
지원되지 않는 플랫폼에서도 파서를 사용할 수 있습니다. 예를 들어 macOS 또는 Windows 랩톱에서 linux lsof
출력으로 파일을 구문 분석할 수 있습니다. 이 경우 -q
cli 옵션 또는 parse()
의 quiet=True
함수 매개변수를 사용하여 경고 메시지를 억제할 수 있습니다.
맥OS:
cat lsof.out | jc -q --lsof
또는 윈도우즈:
type lsof.out | jc -q --lsof
테스트 대상:
코드나 파서를 자유롭게 추가/개선하세요! jc/parsers/foo.py
또는 jc/parsers/foo_s.py (streaming)
파서를 템플릿으로 사용하고 끌어오기 요청과 함께 파서를 제출할 수 있습니다.
자세한 내용은 기여 지침을 참조하세요.
ifconfig-parser
모듈xmltodict
모듈ruamel.yaml
모듈trparse
모듈 다음은 jc
출력의 몇 가지 예입니다. 더 많은 예를 보려면 여기 또는 파서 설명서를 참조하세요.
arp | jc -p --arp # or: jc -p arp
[
{
"address" : " gateway " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:f7:4a:fc " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.1 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:c0:00:08 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.254 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:fe:7a:b4 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
}
]
cat homes.csv
"Sell", "List", "Living", "Rooms", "Beds", "Baths", "Age", "Acres", "Taxes"
142, 160, 28, 10, 5, 3, 60, 0.28, 3167
175, 180, 18, 8, 4, 1, 12, 0.43, 4033
129, 132, 13, 6, 3, 1, 41, 0.33, 1471
...
cat homes.csv | jc -p --csv
[
{
"Sell" : " 142 " ,
"List" : " 160 " ,
"Living" : " 28 " ,
"Rooms" : " 10 " ,
"Beds" : " 5 " ,
"Baths" : " 3 " ,
"Age" : " 60 " ,
"Acres" : " 0.28 " ,
"Taxes" : " 3167 "
},
{
"Sell" : " 175 " ,
"List" : " 180 " ,
"Living" : " 18 " ,
"Rooms" : " 8 " ,
"Beds" : " 4 " ,
"Baths" : " 1 " ,
"Age" : " 12 " ,
"Acres" : " 0.43 " ,
"Taxes" : " 4033 "
},
{
"Sell" : " 129 " ,
"List" : " 132 " ,
"Living" : " 13 " ,
"Rooms" : " 6 " ,
"Beds" : " 3 " ,
"Baths" : " 1 " ,
"Age" : " 41 " ,
"Acres" : " 0.33 " ,
"Taxes" : " 1471 "
}
]
cat /etc/hosts | jc -p --hosts
[
{
"ip" : " 127.0.0.1 " ,
"hostname" : [
" localhost "
]
},
{
"ip" : " ::1 " ,
"hostname" : [
" ip6-localhost " ,
" ip6-loopback "
]
},
{
"ip" : " fe00::0 " ,
"hostname" : [
" ip6-localnet "
]
}
]
ifconfig | jc -p --ifconfig # or: jc -p ifconfig
[
{
"name" : " ens33 " ,
"flags" : 4163 ,
"state" : [
" UP " ,
" BROADCAST " ,
" RUNNING " ,
" MULTICAST "
],
"mtu" : 1500 ,
"ipv4_addr" : " 192.168.71.137 " ,
"ipv4_mask" : " 255.255.255.0 " ,
"ipv4_bcast" : " 192.168.71.255 " ,
"ipv6_addr" : " fe80::c1cb:715d:bc3e:b8a0 " ,
"ipv6_mask" : 64 ,
"ipv6_scope" : " 0x20 " ,
"mac_addr" : " 00:0c:29:3b:58:0e " ,
"type" : " Ethernet " ,
"rx_packets" : 8061 ,
"rx_bytes" : 1514413 ,
"rx_errors" : 0 ,
"rx_dropped" : 0 ,
"rx_overruns" : 0 ,
"rx_frame" : 0 ,
"tx_packets" : 4502 ,
"tx_bytes" : 866622 ,
"tx_errors" : 0 ,
"tx_dropped" : 0 ,
"tx_overruns" : 0 ,
"tx_carrier" : 0 ,
"tx_collisions" : 0 ,
"metric" : null
}
]
cat example.ini
foo = fiz
bar = buz
[section1]
fruit = apple
color = blue
[section2]
fruit = pear
color = green
cat example.ini | jc -p --ini
{
"foo" : " fiz " ,
"bar" : " buz " ,
"section1" : {
"fruit" : " apple " ,
"color" : " blue "
},
"section2" : {
"fruit" : " pear " ,
"color" : " green "
}
}
$ ls -l /usr/bin | jc -p --ls # or: jc -p ls -l /usr/bin
[
{
"filename" : " apropos " ,
"link_to" : " whatis " ,
"flags" : " lrwxrwxrwx. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 6 ,
"date" : " Aug 15 10:53 "
},
{
"filename" : " ar " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 62744 ,
"date" : " Aug 8 16:14 "
},
{
"filename" : " arch " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 33080 ,
"date" : " Aug 19 23:25 "
}
]
netstat -apee | jc -p --netstat # or: jc -p netstat -apee
[
{
"proto" : " tcp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : " LISTEN " ,
"user" : " systemd-resolve " ,
"inode" : 26958 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " tcp6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " LISTEN " ,
"user" : " root " ,
"inode" : 30510 ,
"program_name" : " sshd " ,
"kind" : " network " ,
"pid" : 1186 ,
"local_port" : " ssh " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv6 "
},
{
"proto" : " udp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : null ,
"user" : " systemd-resolve " ,
"inode" : 26957 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " udp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " raw6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " 7 " ,
"user" : " systemd-network " ,
"inode" : 27001 ,
"program_name" : " systemd-network " ,
"kind" : " network " ,
"pid" : 867 ,
"local_port" : " ipv6-icmp " ,
"foreign_port" : " * " ,
"transport_protocol" : null ,
"network_protocol" : " ipv6 "
},
{
"proto" : " unix " ,
"refcnt" : 2 ,
"flags" : null ,
"type" : " DGRAM " ,
"state" : null ,
"inode" : 33322 ,
"program_name" : " systemd " ,
"path" : " /run/user/1000/systemd/notify " ,
"kind" : " socket " ,
"pid" : 1607
}
]
cat /etc/passwd | jc -p --passwd
[
{
"username" : " root " ,
"password" : " * " ,
"uid" : 0 ,
"gid" : 0 ,
"comment" : " System Administrator " ,
"home" : " /var/root " ,
"shell" : " /bin/sh "
},
{
"username" : " daemon " ,
"password" : " * " ,
"uid" : 1 ,
"gid" : 1 ,
"comment" : " System Services " ,
"home" : " /var/root " ,
"shell" : " /usr/bin/false "
}
]
ping 8.8.8.8 -c 3 | jc -p --ping # or: jc -p ping 8.8.8.8 -c 3
{
"destination_ip" : " 8.8.8.8 " ,
"data_bytes" : 56 ,
"pattern" : null ,
"destination" : " 8.8.8.8 " ,
"packets_transmitted" : 3 ,
"packets_received" : 3 ,
"packet_loss_percent" : 0.0 ,
"duplicates" : 0 ,
"time_ms" : 2005.0 ,
"round_trip_ms_min" : 23.835 ,
"round_trip_ms_avg" : 30.46 ,
"round_trip_ms_max" : 34.838 ,
"round_trip_ms_stddev" : 4.766 ,
"responses" : [
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 1 ,
"ttl" : 118 ,
"time_ms" : 23.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 2 ,
"ttl" : 118 ,
"time_ms" : 34.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 3 ,
"ttl" : 118 ,
"time_ms" : 32.7 ,
"duplicate" : false
}
]
}
ps axu | jc -p --ps # or: jc -p ps axu
[
{
"user" : " root " ,
"pid" : 1 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.1 ,
"vsz" : 128072 ,
"rss" : 6784 ,
"tty" : null ,
"stat" : " Ss " ,
"start" : " Nov09 " ,
"time" : " 0:08 " ,
"command" : " /usr/lib/systemd/systemd --switched-root --system --deseria... "
},
{
"user" : " root " ,
"pid" : 2 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kthreadd] "
},
{
"user" : " root " ,
"pid" : 4 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S< " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kworker/0:0H] "
}
]
traceroute -m 2 8.8.8.8 | jc -p --traceroute
# or: jc -p traceroute -m 2 8.8.8.8
{
"destination_ip" : " 8.8.8.8 " ,
"destination_name" : " 8.8.8.8 " ,
"hops" : [
{
"hop" : 1 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.616
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.413
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.308
}
]
},
{
"hop" : 2 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.367
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 40.197
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.162
}
]
}
]
}
uptime | jc -p --uptime # or: jc -p uptime
{
"time" : " 11:35 " ,
"uptime" : " 3 days, 4:03 " ,
"users" : 5 ,
"load_1m" : 1.88 ,
"load_5m" : 2.0 ,
"load_15m" : 1.94 ,
"time_hour" : 11 ,
"time_minute" : 35 ,
"time_second" : null ,
"uptime_days" : 3 ,
"uptime_hours" : 4 ,
"uptime_minutes" : 3 ,
"uptime_total_seconds" : 273780
}
cat cd_catalog.xml
xml version = " 1.0 " encoding = " UTF-8 " ?> < CATALOG > < CD > < TITLE >Empire Burlesque TITLE > < ARTIST >Bob Dylan ARTIST > < COUNTRY >USA COUNTRY > < COMPANY >Columbia COMPANY > < PRICE >10.90 PRICE > < YEAR >1985 YEAR > CD > < CD > < TITLE >Hide your heart TITLE > < ARTIST >Bonnie Tyler ARTIST > < COUNTRY >UK COUNTRY > < COMPANY >CBS Records COMPANY > < PRICE >9.90 PRICE > < YEAR >1988 YEAR > CD > ...
cat cd_catalog.xml | jc -p --xml
{
"CATALOG" : {
"CD" : [
{
"TITLE" : " Empire Burlesque " ,
"ARTIST" : " Bob Dylan " ,
"COUNTRY" : " USA " ,
"COMPANY" : " Columbia " ,
"PRICE" : " 10.90 " ,
"YEAR" : " 1985 "
},
{
"TITLE" : " Hide your heart " ,
"ARTIST" : " Bonnie Tyler " ,
"COUNTRY" : " UK " ,
"COMPANY" : " CBS Records " ,
"PRICE" : " 9.90 " ,
"YEAR" : " 1988 "
}
]
}
}
cat istio.yaml
apiVersion : " authentication.istio.io/v1alpha1 "
kind : " Policy "
metadata :
name : " default "
namespace : " default "
spec :
peers :
- mtls : {}
---
apiVersion : " networking.istio.io/v1alpha3 "
kind : " DestinationRule "
metadata :
name : " default "
namespace : " default "
spec :
host : " *.default.svc.cluster.local "
trafficPolicy :
tls :
mode : ISTIO_MUTUAL
cat istio.yaml | jc -p --yaml
[
{
"apiVersion" : " authentication.istio.io/v1alpha1 " ,
"kind" : " Policy " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"peers" : [
{
"mtls" : {}
}
]
}
},
{
"apiVersion" : " networking.istio.io/v1alpha3 " ,
"kind" : " DestinationRule " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"host" : " *.default.svc.cluster.local " ,
"trafficPolicy" : {
"tls" : {
"mode" : " ISTIO_MUTUAL "
}
}
}
}
]
© 2019-2024 켈리 브라질