diff --git a/doc/formats.md b/doc/formats.md index c76543a8..6910ee8f 100644 --- a/doc/formats.md +++ b/doc/formats.md @@ -163,7 +163,7 @@ Supports decoding BER, CER and DER (X.690). - Does not support specifying a schema. - Supports `torepr` but without schema all sequences and sets will be arrays. -### `frompem` can be used to decode certificates etc +### Can be used to decode certificates etc ```sh $ fq -d raw 'frompem | asn1_ber | d' cert.pem @@ -221,6 +221,11 @@ Limitations: ### References - https://avro.apache.org/docs/current/spec.html#Object+Container+Files +### Authors +- Xentripetal +xentripetal@fastmail.com +[@xentripetal](https://github.com/xentripetal) + ## bencode ### Convert represented value to JSON @@ -429,14 +434,10 @@ $ 'text' | fq -d html -o array=true ] ] ] -``` -```sh -# Decode html files to a {file: "title", ...} object +# decode html files to a {file: "title", ...} object $ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html -``` -```sh # href:s in file $ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html ``` @@ -454,15 +455,20 @@ $ fq '.load_commands[] | select(.cmd=="segment_64")' file ### References - https://github.com/aidansteele/osx-abi-macho-file-format-reference +### Authors +- Sıddık AÇIL +acils@itu.edu.tr +[@Akaame](https://github.com/Akaame) + ## matroska -### Lookup element path using `matroska_path` +### Lookup element using path ```sh $ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv ``` -### Get element path using `matroska_path` +### Get path to element ```sh $ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv @@ -517,14 +523,14 @@ Decode value as mp4 ... | mp4({allow_truncated:false,decode_samples:true}) ``` -### `mp4_path($path)` - Lookup mp4 box using a mp4 box path. +### Lookup mp4 box using a mp4 box path. ```sh # | mp4_path($path) -> $ fq 'mp4_path(".moov.trak[1]")' file.mp4 ``` -### `mp4_path` - Return mp4 box path for a decode value box. +### Get mp4 box path for a decode value box. ```sh # | mp4_path -> string @@ -537,9 +543,10 @@ $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4 $ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d' ``` -### Don't decode samples and manually decode first sample for first track as a `aac_frame` +### Speed up decoding by not decoding samples ```sh +# manually decode first sample as a aac_frame $ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4 ``` @@ -725,9 +732,7 @@ $ echo 'bbbccc' | fq -d xml -o seq=true # access text of the element $ echo 'bbbccc' | fq '.a.c["#text"]' "ccc" -``` -```sh # decode to object and encode to xml $ echo 'bbbccc' | fq -r -d xml -o seq=true 'toxml({indent:2})' @@ -770,11 +775,9 @@ Elements are arrays of the shape `["#text": "body text", "attr_name", {key: "att ] ] ] -``` -```sh # decode to array and encode to xml -✗ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' +$ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' bbb diff --git a/doc/formats.svg b/doc/formats.svg index 3ddbbe1e..34af8ca0 100644 --- a/doc/formats.svg +++ b/doc/formats.svg @@ -8,21 +8,21 @@ viewBox="0.00 0.00 4576.31 2076.01" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> formats - + adts - + adts - + adts_frame adts_frame - + adts_frame - + aac_frame @@ -34,7 +34,7 @@ aac_frame - + aac_frame @@ -46,9 +46,9 @@ apev2 - + apev2 - + image @@ -66,11 +66,11 @@ jpeg - + jpeg - + exif - + icc_profile @@ -82,53 +82,53 @@ mp4 - + mp4 - + aac_frame - + av1_ccr - + av1_frame - + avc_au - + avc_dcr - + flac_frame - + flac_metadatablocks - + hevc_au - + hevc_dcr - + icc_profile - + id3v2 - + image - + jpeg - + mp3_frame - + mpeg_es - + mpeg_pes_packet - + opus_packet - + prores_frame - + protobuf_widevine - + pssh_playready - + vorbis_packet - + vp9_frame - + vpx_ccr @@ -140,11 +140,11 @@ png - + png - + icc_profile - + exif @@ -156,9 +156,9 @@ tiff - + tiff - + icc_profile @@ -170,9 +170,9 @@ webp - + webp - + vp8_frame @@ -184,7 +184,7 @@ gif - + gif @@ -196,9 +196,9 @@ ar - + ar - + probe @@ -228,9 +228,9 @@ bitcoin_blkdat - + bitcoin_blkdat - + bitcoin_block @@ -242,9 +242,9 @@ bzip2 - + bzip2 - + probe @@ -256,11 +256,11 @@ flac - + flac - + flac_metadatablocks - + flac_frame @@ -272,9 +272,9 @@ gzip - + gzip - + probe @@ -292,9 +292,9 @@ macho_fat - + macho_fat - + macho @@ -306,7 +306,7 @@ macho - + macho @@ -318,45 +318,45 @@ matroska - + matroska - + aac_frame - + av1_ccr - + av1_frame - + avc_au - + avc_dcr - + flac_frame - + flac_metadatablocks - + hevc_au - + hevc_dcr - + image - + mp3_frame - + mpeg_asc - + mpeg_pes_packet - + mpeg_spu - + opus_packet - + vorbis_packet - + vp8_frame - + vp9_cfm - + vp9_frame @@ -368,17 +368,17 @@ mp3 - + mp3 - + id3v2 - + id3v1 - + id3v11 - + apev2 - + mp3_frame @@ -396,17 +396,17 @@ ogg - + ogg - + ogg_page - + vorbis_packet - + opus_packet - + flac_metadatablock - + flac_frame @@ -418,13 +418,13 @@ pcap - + pcap - + link_frame - + tcp_stream - + ipv4_packet @@ -436,13 +436,13 @@ pcapng - + pcapng - + link_frame - + tcp_stream - + ipv4_packet @@ -460,9 +460,9 @@ tar - + tar - + probe @@ -480,13 +480,13 @@ wav - + wav - + id3v2 - + id3v1 - + id3v11 @@ -504,9 +504,9 @@ zip - + zip - + probe @@ -518,7 +518,7 @@ avro_ocf - + avro_ocf @@ -530,7 +530,7 @@ elf - + elf @@ -548,7 +548,7 @@ json - + json @@ -560,7 +560,7 @@ jsonl - + jsonl @@ -572,7 +572,7 @@ mpeg_ts - + mpeg_ts @@ -584,7 +584,7 @@ toml - + toml @@ -596,7 +596,7 @@ wasm - + wasm @@ -608,7 +608,7 @@ xml - + xml @@ -620,7 +620,7 @@ yaml - + yaml @@ -632,15 +632,15 @@ av1_frame - + av1_frame - + av1_obu av1_obu - + av1_obu @@ -652,21 +652,21 @@ avc_annexb - + avc_annexb - + avc_nalu avc_nalu - + avc_nalu - + avc_sps - + avc_pps - + avc_sei @@ -678,7 +678,7 @@ avc_sps - + avc_sps @@ -690,7 +690,7 @@ avc_pps - + avc_pps @@ -702,7 +702,7 @@ avc_sei - + avc_sei @@ -714,9 +714,9 @@ avc_au - + avc_au - + avc_nalu @@ -728,9 +728,9 @@ avc_dcr - + avc_dcr - + avc_nalu @@ -742,9 +742,9 @@ bitcoin_block - + bitcoin_block - + bitcoin_transaction @@ -756,9 +756,9 @@ bitcoin_transaction - + bitcoin_transaction - + bitcoin_script @@ -770,7 +770,7 @@ bitcoin_script - + bitcoin_script @@ -782,9 +782,9 @@ bsd_loopback_frame - + bsd_loopback_frame - + inet_packet @@ -802,9 +802,9 @@ ipv4_packet - + ipv4_packet - + ip_packet @@ -816,9 +816,9 @@ ipv6_packet - + ipv6_packet - + ip_packet @@ -836,9 +836,9 @@ ether8023_frame - + ether8023_frame - + inet_packet @@ -850,9 +850,9 @@ flac_metadatablocks - + flac_metadatablocks - + flac_metadatablock @@ -864,7 +864,7 @@ flac_frame - + flac_frame @@ -876,13 +876,13 @@ flac_metadatablock - + flac_metadatablock - + flac_streaminfo - + flac_picture - + vorbis_comment @@ -894,7 +894,7 @@ flac_streaminfo - + flac_streaminfo @@ -906,9 +906,9 @@ flac_picture - + flac_picture - + image @@ -920,9 +920,9 @@ vorbis_comment - + vorbis_comment - + flac_picture @@ -952,21 +952,21 @@ hevc_annexb - + hevc_annexb - + hevc_nalu hevc_nalu - + hevc_nalu - + hevc_vps - + hevc_pps - + hevc_sps @@ -978,7 +978,7 @@ hevc_vps - + hevc_vps @@ -990,7 +990,7 @@ hevc_pps - + hevc_pps @@ -1002,7 +1002,7 @@ hevc_sps - + hevc_sps @@ -1014,9 +1014,9 @@ hevc_au - + hevc_au - + hevc_nalu @@ -1028,9 +1028,9 @@ hevc_dcr - + hevc_dcr - + hevc_nalu @@ -1042,9 +1042,9 @@ id3v2 - + id3v2 - + image @@ -1068,9 +1068,9 @@ udp_datagram - + udp_datagram - + udp_payload @@ -1082,7 +1082,7 @@ icmp - + icmp @@ -1094,7 +1094,7 @@ icmpv6 - + icmpv6 @@ -1106,7 +1106,7 @@ tcp_segment - + tcp_segment @@ -1124,7 +1124,7 @@ exif - + exif @@ -1136,7 +1136,7 @@ icc_profile - + icc_profile @@ -1208,7 +1208,7 @@ av1_ccr - + av1_ccr @@ -1220,9 +1220,9 @@ mp3_frame - + mp3_frame - + xing @@ -1234,7 +1234,7 @@ mpeg_asc - + mpeg_asc @@ -1246,7 +1246,7 @@ mpeg_pes_packet - + mpeg_pes_packet @@ -1258,7 +1258,7 @@ mpeg_spu - + mpeg_spu @@ -1270,9 +1270,9 @@ opus_packet - + opus_packet - + vorbis_comment @@ -1284,9 +1284,9 @@ vorbis_packet - + vorbis_packet - + vorbis_comment @@ -1298,7 +1298,7 @@ vp8_frame - + vp8_frame @@ -1310,7 +1310,7 @@ vp9_cfm - + vp9_cfm @@ -1322,7 +1322,7 @@ vp9_frame - + vp9_frame @@ -1334,7 +1334,7 @@ xing - + xing @@ -1376,7 +1376,7 @@ id3v1 - + id3v1 @@ -1388,7 +1388,7 @@ id3v11 - + id3v11 @@ -1508,11 +1508,11 @@ mpeg_es - + mpeg_es - + mpeg_asc - + vorbis_packet @@ -1524,7 +1524,7 @@ prores_frame - + prores_frame @@ -1536,9 +1536,9 @@ protobuf_widevine - + protobuf_widevine - + protobuf @@ -1550,7 +1550,7 @@ pssh_playready - + pssh_playready @@ -1562,7 +1562,7 @@ vpx_ccr - + vpx_ccr @@ -1586,7 +1586,7 @@ protobuf - + protobuf @@ -1598,11 +1598,11 @@ mpeg_pes - + mpeg_pes - + mpeg_pes_packet - + mpeg_spu @@ -1644,7 +1644,7 @@ ogg_page - + ogg_page @@ -1698,9 +1698,9 @@ sll2_packet - + sll2_packet - + inet_packet @@ -1712,9 +1712,9 @@ sll_packet - + sll_packet - + inet_packet @@ -1726,11 +1726,11 @@ rtmp - + rtmp - + amf0 - + mpeg_asc @@ -1742,7 +1742,7 @@ dns_tcp - + dns_tcp @@ -1790,7 +1790,7 @@ amf0 - + amf0 @@ -1838,7 +1838,7 @@ dns - + dns @@ -1880,61 +1880,61 @@ asn1_ber - + asn1_ber bencode - + bencode bson - + bson cbor - + cbor csv - + csv fairplay_spc - + fairplay_spc html - + html markdown - + markdown msgpack - + msgpack raw - + raw diff --git a/format/all/all.fqtest b/format/all/all.fqtest index 3e17c293..9ecaa2df 100644 --- a/format/all/all.fqtest +++ b/format/all/all.fqtest @@ -32,3 +32,111 @@ $ fq -n _registry.groups.probe "xml", "yaml" ] +$ fq --help formats +aac_frame Advanced Audio Coding frame +adts Audio Data Transport Stream +adts_frame Audio Data Transport Stream frame +amf0 Action Message Format 0 +apev2 APEv2 metadata tag +ar Unix archive +asn1_ber ASN1 BER (basic encoding rules, also CER and DER) +av1_ccr AV1 Codec Configuration Record +av1_frame AV1 frame +av1_obu AV1 Open Bitstream Unit +avc_annexb H.264/AVC Annex B +avc_au H.264/AVC Access Unit +avc_dcr H.264/AVC Decoder Configuration Record +avc_nalu H.264/AVC Network Access Layer Unit +avc_pps H.264/AVC Picture Parameter Set +avc_sei H.264/AVC Supplemental Enhancement Information +avc_sps H.264/AVC Sequence Parameter Set +avro_ocf Avro object container file +bencode BitTorrent bencoding +bitcoin_blkdat Bitcoin blk.dat +bitcoin_block Bitcoin block +bitcoin_script Bitcoin script +bitcoin_transaction Bitcoin transaction +bsd_loopback_frame BSD loopback frame +bson Binary JSON +bzip2 bzip2 compression +cbor Concise Binary Object Representation +csv Comma separated values +dns DNS packet +dns_tcp DNS packet (TCP) +elf Executable and Linkable Format +ether8023_frame Ethernet 802.3 frame +exif Exchangeable Image File Format +fairplay_spc FairPlay Server Playback Context +flac Free Lossless Audio Codec file +flac_frame FLAC frame +flac_metadatablock FLAC metadatablock +flac_metadatablocks FLAC metadatablocks +flac_picture FLAC metadatablock picture +flac_streaminfo FLAC streaminfo +gif Graphics Interchange Format +gzip gzip compression +hevc_annexb H.265/HEVC Annex B +hevc_au H.265/HEVC Access Unit +hevc_dcr H.265/HEVC Decoder Configuration Record +hevc_nalu H.265/HEVC Network Access Layer Unit +hevc_pps H.265/HEVC Picture Parameter Set +hevc_sps H.265/HEVC Sequence Parameter Set +hevc_vps H.265/HEVC Video Parameter Set +html HyperText Markup Language +icc_profile International Color Consortium profile +icmp Internet Control Message Protocol +icmpv6 Internet Control Message Protocol v6 +id3v1 ID3v1 metadata +id3v11 ID3v1.1 metadata +id3v2 ID3v2 metadata +ipv4_packet Internet protocol v4 packet +ipv6_packet Internet protocol v6 packet +jpeg Joint Photographic Experts Group file +json JavaScript Object Notation +jsonl JavaScript Object Notation Lines +macho Mach-O macOS executable +macho_fat Fat Mach-O macOS executable (multi-architecture) +markdown Markdown +matroska Matroska file +mp3 MP3 file +mp3_frame MPEG audio layer 3 frame +mp4 ISOBMFF, QuickTime and similar +mpeg_asc MPEG-4 Audio Specific Config +mpeg_es MPEG Elementary Stream +mpeg_pes MPEG Packetized elementary stream +mpeg_pes_packet MPEG Packetized elementary stream packet +mpeg_spu Sub Picture Unit (DVD subtitle) +mpeg_ts MPEG Transport Stream +msgpack MessagePack +ogg OGG file +ogg_page OGG page +opus_packet Opus packet +pcap PCAP packet capture +pcapng PCAPNG packet capture +png Portable Network Graphics file +prores_frame Apple ProRes frame +protobuf Protobuf +protobuf_widevine Widevine protobuf +pssh_playready PlayReady PSSH +raw Raw bits +rtmp Real-Time Messaging Protocol +sll2_packet Linux cooked capture encapsulation v2 +sll_packet Linux cooked capture encapsulation +tar Tar archive +tcp_segment Transmission control protocol segment +tiff Tag Image File Format +toml Tom's Obvious, Minimal Language +udp_datagram User datagram protocol +vorbis_comment Vorbis comment +vorbis_packet Vorbis packet +vp8_frame VP8 frame +vp9_cfm VP9 Codec Feature Metadata +vp9_frame VP9 frame +vpx_ccr VPX Codec Configuration Record +wasm WebAssembly Binary Format +wav WAV file +webp WebP image +xing Xing header +xml Extensible Markup Language +yaml YAML Ain't Markup Language +zip ZIP archive diff --git a/format/all/help.fqtest b/format/all/help.fqtest deleted file mode 100644 index 9b758dfb..00000000 --- a/format/all/help.fqtest +++ /dev/null @@ -1,1475 +0,0 @@ -$ fq -n '_registry.formats | keys[] | "help(\(.))", ([_help("fq"; .)] | join("\n") | split("\n")[] | ("out \(.)" | println))' -"help(aac_frame)" -out aac_frame: Advanced Audio Coding frame decoder -out # Options -out -out object_type=1 Audio object type -out -out # Decode examples -out -out # Decode file as aac_frame -out $ fq -d aac_frame . file -out # Decode value as aac_frame -out ... | aac_frame -out # Decode file using aac_frame options -out $ fq -d aac_frame -o object_type=1 . file -out # Decode value as aac_frame -out ... | aac_frame({object_type:1}) -out -"help(adts)" -out adts: Audio Data Transport Stream decoder -out -out # Decode examples -out -out # Decode file as adts -out $ fq -d adts . file -out # Decode value as adts -out ... | adts -out -"help(adts_frame)" -out adts_frame: Audio Data Transport Stream frame decoder -out -out # Decode examples -out -out # Decode file as adts_frame -out $ fq -d adts_frame . file -out # Decode value as adts_frame -out ... | adts_frame -out -"help(amf0)" -out amf0: Action Message Format 0 decoder -out -out # Decode examples -out -out # Decode file as amf0 -out $ fq -d amf0 . file -out # Decode value as amf0 -out ... | amf0 -out -"help(apev2)" -out apev2: APEv2 metadata tag decoder -out -out # Decode examples -out -out # Decode file as apev2 -out $ fq -d apev2 . file -out # Decode value as apev2 -out ... | apev2 -out -"help(ar)" -out ar: Unix archive decoder -out -out # Decode examples -out -out # Decode file as ar -out $ fq -d ar . file -out # Decode value as ar -out ... | ar -out -"help(asn1_ber)" -out asn1_ber: ASN1 BER (basic encoding rules, also CER and DER) decoder -out -out # Decode examples -out -out # Decode file as asn1_ber -out $ fq -d asn1_ber . file -out # Decode value as asn1_ber -out ... | asn1_ber -out -out Supports decoding BER, CER and DER (X.690). -out -out - Currently no extra validation is done for CER and DER. -out - Does not support specifying a schema. -out - Supports torepr but without schema all sequences and sets will be arrays. -out -out # frompem can be used to decode certificates etc -out -out $ fq -d raw 'frompem | asn1_ber | d' cert.pem -out -out # Can decode nested values -out -out $ fq -d asn1_ber '.constructed[1].value | asn1_ber' file.ber -out -out # Manual schema -out -out $ fq -d asn1_ber 'torepr as $r | ["version", "modulus", "private_exponent", "private_exponen", "prime1", "prime2", "exponent1", "exponent2", "coefficient"] | with_entries({key: .value, value: $r[.key]})' pkcs1.der -out -out # References -out - https://www.itu.int/ITU-T/studygroups/com10/languages/X.690_1297.pdf -out - https://en.wikipedia.org/wiki/X.690 -out - https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/ -out - https://lapo.it/asn1js/ -out -"help(av1_ccr)" -out av1_ccr: AV1 Codec Configuration Record decoder -out -out # Decode examples -out -out # Decode file as av1_ccr -out $ fq -d av1_ccr . file -out # Decode value as av1_ccr -out ... | av1_ccr -out -"help(av1_frame)" -out av1_frame: AV1 frame decoder -out -out # Decode examples -out -out # Decode file as av1_frame -out $ fq -d av1_frame . file -out # Decode value as av1_frame -out ... | av1_frame -out -"help(av1_obu)" -out av1_obu: AV1 Open Bitstream Unit decoder -out -out # Decode examples -out -out # Decode file as av1_obu -out $ fq -d av1_obu . file -out # Decode value as av1_obu -out ... | av1_obu -out -"help(avc_annexb)" -out avc_annexb: H.264/AVC Annex B decoder -out -out # Decode examples -out -out # Decode file as avc_annexb -out $ fq -d avc_annexb . file -out # Decode value as avc_annexb -out ... | avc_annexb -out -"help(avc_au)" -out avc_au: H.264/AVC Access Unit decoder -out # Options -out -out length_size=4 Length value size -out -out # Decode examples -out -out # Decode file as avc_au -out $ fq -d avc_au . file -out # Decode value as avc_au -out ... | avc_au -out # Decode file using avc_au options -out $ fq -d avc_au -o length_size=4 . file -out # Decode value as avc_au -out ... | avc_au({length_size:4}) -out -"help(avc_dcr)" -out avc_dcr: H.264/AVC Decoder Configuration Record decoder -out -out # Decode examples -out -out # Decode file as avc_dcr -out $ fq -d avc_dcr . file -out # Decode value as avc_dcr -out ... | avc_dcr -out -"help(avc_nalu)" -out avc_nalu: H.264/AVC Network Access Layer Unit decoder -out -out # Decode examples -out -out # Decode file as avc_nalu -out $ fq -d avc_nalu . file -out # Decode value as avc_nalu -out ... | avc_nalu -out -"help(avc_pps)" -out avc_pps: H.264/AVC Picture Parameter Set decoder -out -out # Decode examples -out -out # Decode file as avc_pps -out $ fq -d avc_pps . file -out # Decode value as avc_pps -out ... | avc_pps -out -"help(avc_sei)" -out avc_sei: H.264/AVC Supplemental Enhancement Information decoder -out -out # Decode examples -out -out # Decode file as avc_sei -out $ fq -d avc_sei . file -out # Decode value as avc_sei -out ... | avc_sei -out -"help(avc_sps)" -out avc_sps: H.264/AVC Sequence Parameter Set decoder -out -out # Decode examples -out -out # Decode file as avc_sps -out $ fq -d avc_sps . file -out # Decode value as avc_sps -out ... | avc_sps -out -"help(avro_ocf)" -out avro_ocf: Avro object container file decoder -out -out # Decode examples -out -out # Decode file as avro_ocf -out $ fq -d avro_ocf . file -out # Decode value as avro_ocf -out ... | avro_ocf -out -out Supports reading Avro Object Container Format (OCF) files based on the 1.11.0 specification. -out -out Capable of handling null, deflate, and snappy codecs for data compression. -out -out Limitations: -out -out - Schema does not support self-referential types, only built-in types. -out - Decimal logical types are not supported for decoding, will just be treated as their primitive type -out -out # References -out - https://avro.apache.org/docs/current/spec.html#Object+Container+Files -out -"help(bencode)" -out bencode: BitTorrent bencoding decoder -out -out # Decode examples -out -out # Decode file as bencode -out $ fq -d bencode . file -out # Decode value as bencode -out ... | bencode -out -out # Convert represented value to JSON -out -out $ fq -d bencode torepr file.torrent -out -out # References -out - https://wiki.theory.org/BitTorrentSpecification#Bencoding -out -"help(bitcoin_blkdat)" -out bitcoin_blkdat: Bitcoin blk.dat decoder -out -out # Decode examples -out -out # Decode file as bitcoin_blkdat -out $ fq -d bitcoin_blkdat . file -out # Decode value as bitcoin_blkdat -out ... | bitcoin_blkdat -out -"help(bitcoin_block)" -out bitcoin_block: Bitcoin block decoder -out # Options -out -out has_header=false Has blkdat header -out -out # Decode examples -out -out # Decode file as bitcoin_block -out $ fq -d bitcoin_block . file -out # Decode value as bitcoin_block -out ... | bitcoin_block -out # Decode file using bitcoin_block options -out $ fq -d bitcoin_block -o has_header=false . file -out # Decode value as bitcoin_block -out ... | bitcoin_block({has_header:false}) -out -"help(bitcoin_script)" -out bitcoin_script: Bitcoin script decoder -out -out # Decode examples -out -out # Decode file as bitcoin_script -out $ fq -d bitcoin_script . file -out # Decode value as bitcoin_script -out ... | bitcoin_script -out -"help(bitcoin_transaction)" -out bitcoin_transaction: Bitcoin transaction decoder -out -out # Decode examples -out -out # Decode file as bitcoin_transaction -out $ fq -d bitcoin_transaction . file -out # Decode value as bitcoin_transaction -out ... | bitcoin_transaction -out -"help(bsd_loopback_frame)" -out bsd_loopback_frame: BSD loopback frame decoder -out -out # Decode examples -out -out # Decode file as bsd_loopback_frame -out $ fq -d bsd_loopback_frame . file -out # Decode value as bsd_loopback_frame -out ... | bsd_loopback_frame -out -"help(bson)" -out bson: Binary JSON decoder -out -out # Decode examples -out -out # Decode file as bson -out $ fq -d bson . file -out # Decode value as bson -out ... | bson -out -out # Convert represented value to JSON -out -out $ fq -d bson torepr file.bson -out -out # Filter represented value -out -out $ fq -d bson 'torepr | select(.name=="bob")' file.bson -out -out # References -out - https://bsonspec.org/spec.html -out -"help(bzip2)" -out bzip2: bzip2 compression decoder -out -out # Decode examples -out -out # Decode file as bzip2 -out $ fq -d bzip2 . file -out # Decode value as bzip2 -out ... | bzip2 -out -"help(cbor)" -out cbor: Concise Binary Object Representation decoder -out -out # Decode examples -out -out # Decode file as cbor -out $ fq -d cbor . file -out # Decode value as cbor -out ... | cbor -out -out # Convert represented value to JSON -out -out $ fq -d cbor torepr file.cbor -out -out # References -out - https://en.wikipedia.org/wiki/CBOR -out - https://www.rfc-editor.org/rfc/rfc8949.html -out -"help(csv)" -out csv: Comma separated values decoder -out # Options -out -out comma=, Separator character -out comment=# Comment line character -out -out # Decode examples -out -out # Decode file as csv -out $ fq -d csv . file -out # Decode value as csv -out ... | csv -out # Decode file using csv options -out $ fq -d csv -o comma="," -o comment="#" . file -out # Decode value as csv -out ... | csv({comma:",",comment:"#"}) -out -out # TSV to CSV -out -out $ fq -d csv -o comma="\t" tocsv file.tsv -out -out # Convert rows to objects based on header row -out -out $ fq -d csv '.[0] as $t | .[1:] | map(with_entries(.key = $t[.key]))' file.csv -out -"help(dns)" -out dns: DNS packet decoder -out -out # Decode examples -out -out # Decode file as dns -out $ fq -d dns . file -out # Decode value as dns -out ... | dns -out -"help(dns_tcp)" -out dns_tcp: DNS packet (TCP) decoder -out -out # Decode examples -out -out # Decode file as dns_tcp -out $ fq -d dns_tcp . file -out # Decode value as dns_tcp -out ... | dns_tcp -out -"help(elf)" -out elf: Executable and Linkable Format decoder -out -out # Decode examples -out -out # Decode file as elf -out $ fq -d elf . file -out # Decode value as elf -out ... | elf -out -"help(ether8023_frame)" -out ether8023_frame: Ethernet 802.3 frame decoder -out -out # Decode examples -out -out # Decode file as ether8023_frame -out $ fq -d ether8023_frame . file -out # Decode value as ether8023_frame -out ... | ether8023_frame -out -"help(exif)" -out exif: Exchangeable Image File Format decoder -out -out # Decode examples -out -out # Decode file as exif -out $ fq -d exif . file -out # Decode value as exif -out ... | exif -out -"help(fairplay_spc)" -out fairplay_spc: FairPlay Server Playback Context decoder -out -out # Decode examples -out -out # Decode file as fairplay_spc -out $ fq -d fairplay_spc . file -out # Decode value as fairplay_spc -out ... | fairplay_spc -out -"help(flac)" -out flac: Free Lossless Audio Codec file decoder -out -out # Decode examples -out -out # Decode file as flac -out $ fq -d flac . file -out # Decode value as flac -out ... | flac -out -"help(flac_frame)" -out flac_frame: FLAC frame decoder -out # Options -out -out bits_per_sample=16 Bits per sample -out -out # Decode examples -out -out # Decode file as flac_frame -out $ fq -d flac_frame . file -out # Decode value as flac_frame -out ... | flac_frame -out # Decode file using flac_frame options -out $ fq -d flac_frame -o bits_per_sample=16 . file -out # Decode value as flac_frame -out ... | flac_frame({bits_per_sample:16}) -out -"help(flac_metadatablock)" -out flac_metadatablock: FLAC metadatablock decoder -out -out # Decode examples -out -out # Decode file as flac_metadatablock -out $ fq -d flac_metadatablock . file -out # Decode value as flac_metadatablock -out ... | flac_metadatablock -out -"help(flac_metadatablocks)" -out flac_metadatablocks: FLAC metadatablocks decoder -out -out # Decode examples -out -out # Decode file as flac_metadatablocks -out $ fq -d flac_metadatablocks . file -out # Decode value as flac_metadatablocks -out ... | flac_metadatablocks -out -"help(flac_picture)" -out flac_picture: FLAC metadatablock picture decoder -out -out # Decode examples -out -out # Decode file as flac_picture -out $ fq -d flac_picture . file -out # Decode value as flac_picture -out ... | flac_picture -out -"help(flac_streaminfo)" -out flac_streaminfo: FLAC streaminfo decoder -out -out # Decode examples -out -out # Decode file as flac_streaminfo -out $ fq -d flac_streaminfo . file -out # Decode value as flac_streaminfo -out ... | flac_streaminfo -out -"help(gif)" -out gif: Graphics Interchange Format decoder -out -out # Decode examples -out -out # Decode file as gif -out $ fq -d gif . file -out # Decode value as gif -out ... | gif -out -"help(gzip)" -out gzip: gzip compression decoder -out -out # Decode examples -out -out # Decode file as gzip -out $ fq -d gzip . file -out # Decode value as gzip -out ... | gzip -out -"help(hevc_annexb)" -out hevc_annexb: H.265/HEVC Annex B decoder -out -out # Decode examples -out -out # Decode file as hevc_annexb -out $ fq -d hevc_annexb . file -out # Decode value as hevc_annexb -out ... | hevc_annexb -out -"help(hevc_au)" -out hevc_au: H.265/HEVC Access Unit decoder -out # Options -out -out length_size=4 Length value size -out -out # Decode examples -out -out # Decode file as hevc_au -out $ fq -d hevc_au . file -out # Decode value as hevc_au -out ... | hevc_au -out # Decode file using hevc_au options -out $ fq -d hevc_au -o length_size=4 . file -out # Decode value as hevc_au -out ... | hevc_au({length_size:4}) -out -"help(hevc_dcr)" -out hevc_dcr: H.265/HEVC Decoder Configuration Record decoder -out -out # Decode examples -out -out # Decode file as hevc_dcr -out $ fq -d hevc_dcr . file -out # Decode value as hevc_dcr -out ... | hevc_dcr -out -"help(hevc_nalu)" -out hevc_nalu: H.265/HEVC Network Access Layer Unit decoder -out -out # Decode examples -out -out # Decode file as hevc_nalu -out $ fq -d hevc_nalu . file -out # Decode value as hevc_nalu -out ... | hevc_nalu -out -"help(hevc_pps)" -out hevc_pps: H.265/HEVC Picture Parameter Set decoder -out -out # Decode examples -out -out # Decode file as hevc_pps -out $ fq -d hevc_pps . file -out # Decode value as hevc_pps -out ... | hevc_pps -out -"help(hevc_sps)" -out hevc_sps: H.265/HEVC Sequence Parameter Set decoder -out -out # Decode examples -out -out # Decode file as hevc_sps -out $ fq -d hevc_sps . file -out # Decode value as hevc_sps -out ... | hevc_sps -out -"help(hevc_vps)" -out hevc_vps: H.265/HEVC Video Parameter Set decoder -out -out # Decode examples -out -out # Decode file as hevc_vps -out $ fq -d hevc_vps . file -out # Decode value as hevc_vps -out ... | hevc_vps -out -"help(html)" -out html: HyperText Markup Language decoder -out # Options -out -out array=false Decode as nested arrays -out attribute_prefix=@ Prefix for attribute keys -out seq=false Use seq attribute to preserve element order -out -out # Decode examples -out -out # Decode file as html -out $ fq -d html . file -out # Decode value as html -out ... | html -out # Decode file using html options -out $ fq -d html -o array=false -o attribute_prefix="@" -o seq=false . file -out # Decode value as html -out ... | html({array:false,attribute_prefix:"@",seq:false}) -out -out HTML is decoded in HTML5 mode and will always include , and element. -out -out See xml format for more examples and how to preserve element order and how to encode to xml. -out -out There is no tohtml function, see toxml instead. -out -out # Element as object -out -out # decode as object is the default -out $ echo 'text' | fq -d html -out { -out "html": { -out "body": { -out "a": { -out "#text": "text", -out "@href": "url" -out } -out }, -out "head": "" -out } -out } -out -out # Element as array -out -out $ 'text' | fq -d html -o array=true -out [ -out "html", -out null, -out [ -out [ -out "head", -out null, -out [] -out ], -out [ -out "body", -out null, -out [ -out [ -out "a", -out { -out "#text": "text", -out "href": "url" -out }, -out [] -out ] -out ] -out ] -out ] -out ] -out -out -out # Decode html files to a {file: "title", ...} object -out $ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html -out -out -out # href:s in file -out $ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html -out -"help(icc_profile)" -out icc_profile: International Color Consortium profile decoder -out -out # Decode examples -out -out # Decode file as icc_profile -out $ fq -d icc_profile . file -out # Decode value as icc_profile -out ... | icc_profile -out -"help(icmp)" -out icmp: Internet Control Message Protocol decoder -out -out # Decode examples -out -out # Decode file as icmp -out $ fq -d icmp . file -out # Decode value as icmp -out ... | icmp -out -"help(icmpv6)" -out icmpv6: Internet Control Message Protocol v6 decoder -out -out # Decode examples -out -out # Decode file as icmpv6 -out $ fq -d icmpv6 . file -out # Decode value as icmpv6 -out ... | icmpv6 -out -"help(id3v1)" -out id3v1: ID3v1 metadata decoder -out -out # Decode examples -out -out # Decode file as id3v1 -out $ fq -d id3v1 . file -out # Decode value as id3v1 -out ... | id3v1 -out -"help(id3v11)" -out id3v11: ID3v1.1 metadata decoder -out -out # Decode examples -out -out # Decode file as id3v11 -out $ fq -d id3v11 . file -out # Decode value as id3v11 -out ... | id3v11 -out -"help(id3v2)" -out id3v2: ID3v2 metadata decoder -out -out # Decode examples -out -out # Decode file as id3v2 -out $ fq -d id3v2 . file -out # Decode value as id3v2 -out ... | id3v2 -out -"help(ipv4_packet)" -out ipv4_packet: Internet protocol v4 packet decoder -out -out # Decode examples -out -out # Decode file as ipv4_packet -out $ fq -d ipv4_packet . file -out # Decode value as ipv4_packet -out ... | ipv4_packet -out -"help(ipv6_packet)" -out ipv6_packet: Internet protocol v6 packet decoder -out -out # Decode examples -out -out # Decode file as ipv6_packet -out $ fq -d ipv6_packet . file -out # Decode value as ipv6_packet -out ... | ipv6_packet -out -"help(jpeg)" -out jpeg: Joint Photographic Experts Group file decoder -out -out # Decode examples -out -out # Decode file as jpeg -out $ fq -d jpeg . file -out # Decode value as jpeg -out ... | jpeg -out -"help(json)" -out json: JavaScript Object Notation decoder -out -out # Decode examples -out -out # Decode file as json -out $ fq -d json . file -out # Decode value as json -out ... | json -out -"help(jsonl)" -out jsonl: JavaScript Object Notation Lines decoder -out -out # Decode examples -out -out # Decode file as jsonl -out $ fq -d jsonl . file -out # Decode value as jsonl -out ... | jsonl -out -"help(macho)" -out macho: Mach-O macOS executable decoder -out -out # Decode examples -out -out # Decode file as macho -out $ fq -d macho . file -out # Decode value as macho -out ... | macho -out -out Supports decoding vanilla and FAT Mach-O binaries. -out -out # Select 64bit load segments -out -out $ fq '.load_commands[] | select(.cmd=="segment_64")' file -out -out # References -out - https://github.com/aidansteele/osx-abi-macho-file-format-reference -out -"help(macho_fat)" -out macho_fat: Fat Mach-O macOS executable (multi-architecture) decoder -out -out # Decode examples -out -out # Decode file as macho_fat -out $ fq -d macho_fat . file -out # Decode value as macho_fat -out ... | macho_fat -out -"help(markdown)" -out markdown: Markdown decoder -out -out # Decode examples -out -out # Decode file as markdown -out $ fq -d markdown . file -out # Decode value as markdown -out ... | markdown -out -"help(matroska)" -out matroska: Matroska file decoder -out -out # Decode examples -out -out # Decode file as matroska -out $ fq -d matroska . file -out # Decode value as matroska -out ... | matroska -out -out # Lookup element path using matroska_path -out -out $ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv -out -out # Get element path using matroska_path -out -out $ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv -out -out # References -out - https://tools.ietf.org/html/draft-ietf-cellar-ebml-00 -out - https://matroska.org/technical/specs/index.html -out - https://www.matroska.org/technical/basics.html -out - https://www.matroska.org/technical/codec_specs.html -out - https://wiki.xiph.org/MatroskaOpus -out -"help(mp3)" -out mp3: MP3 file decoder -out # Options -out -out max_sync_seek=32768 Max byte distance to next sync -out max_unique_header_configs=5 Max number of unique frame header configs allowed -out -out # Decode examples -out -out # Decode file as mp3 -out $ fq -d mp3 . file -out # Decode value as mp3 -out ... | mp3 -out # Decode file using mp3 options -out $ fq -d mp3 -o max_sync_seek=32768 -o max_unique_header_configs=5 . file -out # Decode value as mp3 -out ... | mp3({max_sync_seek:32768,max_unique_header_configs:5}) -out -"help(mp3_frame)" -out mp3_frame: MPEG audio layer 3 frame decoder -out -out # Decode examples -out -out # Decode file as mp3_frame -out $ fq -d mp3_frame . file -out # Decode value as mp3_frame -out ... | mp3_frame -out -"help(mp4)" -out mp4: ISOBMFF, QuickTime and similar decoder -out # Options -out -out allow_truncated=false Allow box to be truncated -out decode_samples=true Decode supported media samples -out -out # Decode examples -out -out # Decode file as mp4 -out $ fq -d mp4 . file -out # Decode value as mp4 -out ... | mp4 -out # Decode file using mp4 options -out $ fq -d mp4 -o allow_truncated=false -o decode_samples=true . file -out # Decode value as mp4 -out ... | mp4({allow_truncated:false,decode_samples:true}) -out -out # mp4_path($path) - Lookup mp4 box using a mp4 box path. -out -out # | mp4_path($path) -> -out $ fq 'mp4_path(".moov.trak[1]")' file.mp4 -out -out # mp4_path - Return mp4 box path for a decode value box. -out -out # | mp4_path -> string -out $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4 -out -out # Force decode a single box -out -out $ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d' -out -out # Don't decode samples and manually decode first sample for first track as a aac_frame -out -out $ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4 -out -out # Entries for first edit list as values -out -out $ fq 'first(grep_by(.type=="elst").entries) | tovalue' file.mp4 -out -out # References -out - ISO/IEC base media file format (MPEG-4 Part 12) (https://en.wikipedia.org/wiki/ISO/IEC_base_media_file_format) -out - Quicktime file format (https://developer.apple.com/standards/qtff-2001.pdf) -out -"help(mpeg_asc)" -out mpeg_asc: MPEG-4 Audio Specific Config decoder -out -out # Decode examples -out -out # Decode file as mpeg_asc -out $ fq -d mpeg_asc . file -out # Decode value as mpeg_asc -out ... | mpeg_asc -out -"help(mpeg_es)" -out mpeg_es: MPEG Elementary Stream decoder -out -out # Decode examples -out -out # Decode file as mpeg_es -out $ fq -d mpeg_es . file -out # Decode value as mpeg_es -out ... | mpeg_es -out -"help(mpeg_pes)" -out mpeg_pes: MPEG Packetized elementary stream decoder -out -out # Decode examples -out -out # Decode file as mpeg_pes -out $ fq -d mpeg_pes . file -out # Decode value as mpeg_pes -out ... | mpeg_pes -out -"help(mpeg_pes_packet)" -out mpeg_pes_packet: MPEG Packetized elementary stream packet decoder -out -out # Decode examples -out -out # Decode file as mpeg_pes_packet -out $ fq -d mpeg_pes_packet . file -out # Decode value as mpeg_pes_packet -out ... | mpeg_pes_packet -out -"help(mpeg_spu)" -out mpeg_spu: Sub Picture Unit (DVD subtitle) decoder -out -out # Decode examples -out -out # Decode file as mpeg_spu -out $ fq -d mpeg_spu . file -out # Decode value as mpeg_spu -out ... | mpeg_spu -out -"help(mpeg_ts)" -out mpeg_ts: MPEG Transport Stream decoder -out -out # Decode examples -out -out # Decode file as mpeg_ts -out $ fq -d mpeg_ts . file -out # Decode value as mpeg_ts -out ... | mpeg_ts -out -"help(msgpack)" -out msgpack: MessagePack decoder -out -out # Decode examples -out -out # Decode file as msgpack -out $ fq -d msgpack . file -out # Decode value as msgpack -out ... | msgpack -out -out # Convert represented value to JSON -out -out $ fq -d msgpack torepr file.msgpack -out -out # References -out - https://github.com/msgpack/msgpack/blob/master/spec.md -out -"help(ogg)" -out ogg: OGG file decoder -out -out # Decode examples -out -out # Decode file as ogg -out $ fq -d ogg . file -out # Decode value as ogg -out ... | ogg -out -"help(ogg_page)" -out ogg_page: OGG page decoder -out -out # Decode examples -out -out # Decode file as ogg_page -out $ fq -d ogg_page . file -out # Decode value as ogg_page -out ... | ogg_page -out -"help(opus_packet)" -out opus_packet: Opus packet decoder -out -out # Decode examples -out -out # Decode file as opus_packet -out $ fq -d opus_packet . file -out # Decode value as opus_packet -out ... | opus_packet -out -"help(pcap)" -out pcap: PCAP packet capture decoder -out -out # Decode examples -out -out # Decode file as pcap -out $ fq -d pcap . file -out # Decode value as pcap -out ... | pcap -out -"help(pcapng)" -out pcapng: PCAPNG packet capture decoder -out -out # Decode examples -out -out # Decode file as pcapng -out $ fq -d pcapng . file -out # Decode value as pcapng -out ... | pcapng -out -"help(png)" -out png: Portable Network Graphics file decoder -out -out # Decode examples -out -out # Decode file as png -out $ fq -d png . file -out # Decode value as png -out ... | png -out -"help(prores_frame)" -out prores_frame: Apple ProRes frame decoder -out -out # Decode examples -out -out # Decode file as prores_frame -out $ fq -d prores_frame . file -out # Decode value as prores_frame -out ... | prores_frame -out -"help(protobuf)" -out protobuf: Protobuf decoder -out -out # Decode examples -out -out # Decode file as protobuf -out $ fq -d protobuf . file -out # Decode value as protobuf -out ... | protobuf -out -out # Can decode sub messages -out -out $ fq -d protobuf '.fields[6].wire_value | protobuf | d' file -out -out # References -out - https://developers.google.com/protocol-buffers/docs/encoding -out -"help(protobuf_widevine)" -out protobuf_widevine: Widevine protobuf decoder -out -out # Decode examples -out -out # Decode file as protobuf_widevine -out $ fq -d protobuf_widevine . file -out # Decode value as protobuf_widevine -out ... | protobuf_widevine -out -"help(pssh_playready)" -out pssh_playready: PlayReady PSSH decoder -out -out # Decode examples -out -out # Decode file as pssh_playready -out $ fq -d pssh_playready . file -out # Decode value as pssh_playready -out ... | pssh_playready -out -"help(raw)" -out raw: Raw bits decoder -out -out # Decode examples -out -out # Decode file as raw -out $ fq -d raw . file -out # Decode value as raw -out ... | raw -out -"help(rtmp)" -out rtmp: Real-Time Messaging Protocol decoder -out -out # Decode examples -out -out # Decode file as rtmp -out $ fq -d rtmp . file -out # Decode value as rtmp -out ... | rtmp -out -out Current only supports plain RTMP (not RTMPT or encrypted variants etc) with AMF0 (not AMF3). -out -out # References -out - https://rtmp.veriskope.com/docs/spec/ -out - https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf -out -"help(sll2_packet)" -out sll2_packet: Linux cooked capture encapsulation v2 decoder -out -out # Decode examples -out -out # Decode file as sll2_packet -out $ fq -d sll2_packet . file -out # Decode value as sll2_packet -out ... | sll2_packet -out -"help(sll_packet)" -out sll_packet: Linux cooked capture encapsulation decoder -out -out # Decode examples -out -out # Decode file as sll_packet -out $ fq -d sll_packet . file -out # Decode value as sll_packet -out ... | sll_packet -out -"help(tar)" -out tar: Tar archive decoder -out -out # Decode examples -out -out # Decode file as tar -out $ fq -d tar . file -out # Decode value as tar -out ... | tar -out -"help(tcp_segment)" -out tcp_segment: Transmission control protocol segment decoder -out -out # Decode examples -out -out # Decode file as tcp_segment -out $ fq -d tcp_segment . file -out # Decode value as tcp_segment -out ... | tcp_segment -out -"help(tiff)" -out tiff: Tag Image File Format decoder -out -out # Decode examples -out -out # Decode file as tiff -out $ fq -d tiff . file -out # Decode value as tiff -out ... | tiff -out -"help(toml)" -out toml: Tom's Obvious, Minimal Language decoder -out -out # Decode examples -out -out # Decode file as toml -out $ fq -d toml . file -out # Decode value as toml -out ... | toml -out -"help(udp_datagram)" -out udp_datagram: User datagram protocol decoder -out -out # Decode examples -out -out # Decode file as udp_datagram -out $ fq -d udp_datagram . file -out # Decode value as udp_datagram -out ... | udp_datagram -out -"help(vorbis_comment)" -out vorbis_comment: Vorbis comment decoder -out -out # Decode examples -out -out # Decode file as vorbis_comment -out $ fq -d vorbis_comment . file -out # Decode value as vorbis_comment -out ... | vorbis_comment -out -"help(vorbis_packet)" -out vorbis_packet: Vorbis packet decoder -out -out # Decode examples -out -out # Decode file as vorbis_packet -out $ fq -d vorbis_packet . file -out # Decode value as vorbis_packet -out ... | vorbis_packet -out -"help(vp8_frame)" -out vp8_frame: VP8 frame decoder -out -out # Decode examples -out -out # Decode file as vp8_frame -out $ fq -d vp8_frame . file -out # Decode value as vp8_frame -out ... | vp8_frame -out -"help(vp9_cfm)" -out vp9_cfm: VP9 Codec Feature Metadata decoder -out -out # Decode examples -out -out # Decode file as vp9_cfm -out $ fq -d vp9_cfm . file -out # Decode value as vp9_cfm -out ... | vp9_cfm -out -"help(vp9_frame)" -out vp9_frame: VP9 frame decoder -out -out # Decode examples -out -out # Decode file as vp9_frame -out $ fq -d vp9_frame . file -out # Decode value as vp9_frame -out ... | vp9_frame -out -"help(vpx_ccr)" -out vpx_ccr: VPX Codec Configuration Record decoder -out -out # Decode examples -out -out # Decode file as vpx_ccr -out $ fq -d vpx_ccr . file -out # Decode value as vpx_ccr -out ... | vpx_ccr -out -"help(wasm)" -out wasm: WebAssembly Binary Format decoder -out -out # Decode examples -out -out # Decode file as wasm -out $ fq -d wasm . file -out # Decode value as wasm -out ... | wasm -out -out # Count opcode usage -out -out $ fq '.sections[] | select(.id == "code_section") | [.. | .opcode? // empty] | count | map({key: .[0], value: .[1]}) | from_entries' file.wasm -out -out # List exports and imports -out -out $ fq '.sections | {import: map(select(.id == "import_section").content.im.x[].nm.b), export: map(select(.id == "export_section").content.ex.x[].nm.b)}' file.wasm -out -out # Authors -out - Takashi Oguma @bitbears-dev (https://github.com/bitbears-dev) @0xb17bea125 (https://twitter.com/0xb17bea125) -out -out # References -out - https://webassembly.github.io/spec/core/ -out -"help(wav)" -out wav: WAV file decoder -out -out # Decode examples -out -out # Decode file as wav -out $ fq -d wav . file -out # Decode value as wav -out ... | wav -out -"help(webp)" -out webp: WebP image decoder -out -out # Decode examples -out -out # Decode file as webp -out $ fq -d webp . file -out # Decode value as webp -out ... | webp -out -"help(xing)" -out xing: Xing header decoder -out -out # Decode examples -out -out # Decode file as xing -out $ fq -d xing . file -out # Decode value as xing -out ... | xing -out -"help(xml)" -out xml: Extensible Markup Language decoder -out # Options -out -out array=false Decode as nested arrays -out attribute_prefix=@ Prefix for attribute keys -out seq=false Use seq attribute to preserve element order -out -out # Decode examples -out -out # Decode file as xml -out $ fq -d xml . file -out # Decode value as xml -out ... | xml -out # Decode file using xml options -out $ fq -d xml -o array=false -o attribute_prefix="@" -o seq=false . file -out # Decode value as xml -out ... | xml({array:false,attribute_prefix:"@",seq:false}) -out -out XML can be decoded and encoded into jq values in two ways, elements as object or array. Which variant to use depends a bit what you want to do. The object variant -out might be easier to query for a specific value but array might be easier to use to generate xml or to query after all elements of some kind etc. -out -out Encoding is done using the toxml function and it will figure what variant that is used based on the input value. Is has two optional options indent and -out attribute_prefix. -out -out # Elements as object -out Element can have different shapes depending on body text, attributes and children: -out -out - text is {"a":{"#text":"text","@key":"value"}}, has text (#text) and attributes (@key) -out - text is {"a":"text"} -out - text is {"a":{"b":"text"}} one child with only text and no attributes -out - text is {"a":{"b":["","text"]}} two children with same name end up in an array -out - text is {"a":{"b":["",{"#text":"text","@key":"value"}]}} -out -out If there is #seq attribute it encodes the child element order. Use -o seq=true to include sequence number when decoding, otherwise order might be lost. -out -out -out # decode as object is the default -out $ echo 'bbbccc' | fq -d xml -o seq=true -out { -out "a": { -out "b": [ -out { -out "#seq": 0 -out }, -out { -out "#seq": 1, -out "#text": "bbb" -out } -out ], -out "c": { -out "#seq": 2, -out "#text": "ccc", -out "@attr": "value" -out } -out } -out } -out -out # access text of the element -out $ echo 'bbbccc' | fq '.a.c["#text"]' -out "ccc" -out -out -out # decode to object and encode to xml -out $ echo 'bbbccc' | fq -r -d xml -o seq=true 'toxml({indent:2})' -out -out -out bbb -out ccc -out -out -out # Elements as array -out Elements are arrays of the shape ["#text": "body text", "attr_name", {key: "attr value"}|null, [, ...]]. -out -out -out # decode as array -out ✗ echo 'bbbccc' | fq -d xml -o array=true -out [ -out "a", -out null, -out [ -out [ -out "b", -out null, -out [] -out ], -out [ -out "b", -out { -out "#text": "bbb" -out }, -out [] -out ], -out [ -out "c", -out { -out "#text": "ccc", -out "attr": "value" -out }, -out [] -out ] -out ] -out ] -out -out -out # decode to array and encode to xml -out ✗ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' -out -out -out bbb -out ccc -out -out -out # access text of the element, the object variant above is probably easier to use -out $ echo 'bbbccc' | fq -o array=true '.[2][2][1]["#text"]' -out "ccc" -out -out # References -out - xml.com's Converting Between XML and JSON (https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html) -out -"help(yaml)" -out yaml: YAML Ain't Markup Language decoder -out -out # Decode examples -out -out # Decode file as yaml -out $ fq -d yaml . file -out # Decode value as yaml -out ... | yaml -out -"help(zip)" -out zip: ZIP archive decoder -out # Options -out -out uncompress=true Uncompress and probe files -out -out # Decode examples -out -out # Decode file as zip -out $ fq -d zip . file -out # Decode value as zip -out ... | zip -out # Decode file using zip options -out $ fq -d zip -o uncompress=true . file -out # Decode value as zip -out ... | zip({uncompress:true}) -out -out Supports ZIP64. -out -out # References -out - https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT -out - https://opensource.apple.com/source/zip/zip-6/unzip/unzip/proginfo/extra.fld -out diff --git a/format/asn1/asn1_ber.md b/format/asn1/asn1_ber.md index 07813dba..aca678be 100644 --- a/format/asn1/asn1_ber.md +++ b/format/asn1/asn1_ber.md @@ -4,7 +4,7 @@ Supports decoding BER, CER and DER (X.690). - Does not support specifying a schema. - Supports `torepr` but without schema all sequences and sets will be arrays. -### `frompem` can be used to decode certificates etc +### Can be used to decode certificates etc ```sh $ fq -d raw 'frompem | asn1_ber | d' cert.pem diff --git a/format/asn1/testdata/help_asn1_ber.fqtest b/format/asn1/testdata/help_asn1_ber.fqtest new file mode 100644 index 00000000..aaac2765 --- /dev/null +++ b/format/asn1/testdata/help_asn1_ber.fqtest @@ -0,0 +1,39 @@ +$ fq -h asn1_ber +asn1_ber: ASN1 BER (basic encoding rules, also CER and DER) decoder + +Decode examples +=============== + + # Decode file as asn1_ber + $ fq -d asn1_ber . file + # Decode value as asn1_ber + ... | asn1_ber + +Supports decoding BER, CER and DER (X.690). + +- Currently no extra validation is done for CER and DER. +- Does not support specifying a schema. +- Supports torepr but without schema all sequences and sets will be arrays. + +Can be used to decode certificates etc +====================================== + + $ fq -d raw 'frompem | asn1_ber | d' cert.pem + +Can decode nested values +======================== + + $ fq -d asn1_ber '.constructed[1].value | asn1_ber' file.ber + +Manual schema +============= + + $ fq -d asn1_ber 'torepr as $r | ["version", "modulus", "private_exponent", "private_exponen", "prime1", "prime2", "exponent1", "exponent2", "coefficient"] | with_entries({key: .value, value: $r[.key]})' pkcs1.der + +References +========== +- https://www.itu.int/ITU-T/studygroups/com10/languages/X.690_1297.pdf +- https://en.wikipedia.org/wiki/X.690 +- https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/ +- https://lapo.it/asn1js/ + diff --git a/format/avro/avro_ocf.md b/format/avro/avro_ocf.md index 51d9056e..e61f2f72 100644 --- a/format/avro/avro_ocf.md +++ b/format/avro/avro_ocf.md @@ -9,3 +9,8 @@ Limitations: ### References - https://avro.apache.org/docs/current/spec.html#Object+Container+Files + +### Authors +- Xentripetal +xentripetal@fastmail.com +[@xentripetal](https://github.com/xentripetal) diff --git a/format/avro/testdata/help_avro_ocf.fqtest b/format/avro/testdata/help_avro_ocf.fqtest new file mode 100644 index 00000000..acb31777 --- /dev/null +++ b/format/avro/testdata/help_avro_ocf.fqtest @@ -0,0 +1,28 @@ +$ fq -h avro_ocf +avro_ocf: Avro object container file decoder + +Decode examples +=============== + + # Decode file as avro_ocf + $ fq -d avro_ocf . file + # Decode value as avro_ocf + ... | avro_ocf + +Supports reading Avro Object Container Format (OCF) files based on the 1.11.0 specification. + +Capable of handling null, deflate, and snappy codecs for data compression. + +Limitations: + +- Schema does not support self-referential types, only built-in types. +- Decimal logical types are not supported for decoding, will just be treated as their primitive type + +References +========== +- https://avro.apache.org/docs/current/spec.html#Object+Container+Files + +Authors +======= +- Xentripetal xentripetal@fastmail.com @xentripetal (https://github.com/xentripetal) + diff --git a/format/bencode/testdata/help_bencode.fqtest b/format/bencode/testdata/help_bencode.fqtest new file mode 100644 index 00000000..5af2c3d4 --- /dev/null +++ b/format/bencode/testdata/help_bencode.fqtest @@ -0,0 +1,20 @@ +$ fq -h bencode +bencode: BitTorrent bencoding decoder + +Decode examples +=============== + + # Decode file as bencode + $ fq -d bencode . file + # Decode value as bencode + ... | bencode + +Convert represented value to JSON +================================= + + $ fq -d bencode torepr file.torrent + +References +========== +- https://wiki.theory.org/BitTorrentSpecification#Bencoding + diff --git a/format/bitcoin/testdata/help_bitcoin_block.fqtest b/format/bitcoin/testdata/help_bitcoin_block.fqtest new file mode 100644 index 00000000..027d97de --- /dev/null +++ b/format/bitcoin/testdata/help_bitcoin_block.fqtest @@ -0,0 +1,20 @@ +$ fq -h bitcoin_block +bitcoin_block: Bitcoin block decoder + +Options +======= + + has_header=false Has blkdat header + +Decode examples +=============== + + # Decode file as bitcoin_block + $ fq -d bitcoin_block . file + # Decode value as bitcoin_block + ... | bitcoin_block + # Decode file using bitcoin_block options + $ fq -d bitcoin_block -o has_header=false . file + # Decode value as bitcoin_block + ... | bitcoin_block({has_header:false}) + diff --git a/format/bson/testdata/help_bson.fqtest b/format/bson/testdata/help_bson.fqtest new file mode 100644 index 00000000..814c8658 --- /dev/null +++ b/format/bson/testdata/help_bson.fqtest @@ -0,0 +1,25 @@ +$ fq -h bson +bson: Binary JSON decoder + +Decode examples +=============== + + # Decode file as bson + $ fq -d bson . file + # Decode value as bson + ... | bson + +Convert represented value to JSON +================================= + + $ fq -d bson torepr file.bson + +Filter represented value +======================== + + $ fq -d bson 'torepr | select(.name=="bob")' file.bson + +References +========== +- https://bsonspec.org/spec.html + diff --git a/format/cbor/testdata/help_cbor.fqtest b/format/cbor/testdata/help_cbor.fqtest new file mode 100644 index 00000000..a0175d07 --- /dev/null +++ b/format/cbor/testdata/help_cbor.fqtest @@ -0,0 +1,21 @@ +$ fq -h cbor +cbor: Concise Binary Object Representation decoder + +Decode examples +=============== + + # Decode file as cbor + $ fq -d cbor . file + # Decode value as cbor + ... | cbor + +Convert represented value to JSON +================================= + + $ fq -d cbor torepr file.cbor + +References +========== +- https://en.wikipedia.org/wiki/CBOR +- https://www.rfc-editor.org/rfc/rfc8949.html + diff --git a/format/csv/testdata/help_csv.fqtest b/format/csv/testdata/help_csv.fqtest new file mode 100644 index 00000000..f5b85907 --- /dev/null +++ b/format/csv/testdata/help_csv.fqtest @@ -0,0 +1,31 @@ +$ fq -h csv +csv: Comma separated values decoder + +Options +======= + + comma=, Separator character + comment=# Comment line character + +Decode examples +=============== + + # Decode file as csv + $ fq -d csv . file + # Decode value as csv + ... | csv + # Decode file using csv options + $ fq -d csv -o comma="," -o comment="#" . file + # Decode value as csv + ... | csv({comma:",",comment:"#"}) + +TSV to CSV +========== + + $ fq -d csv -o comma="\t" tocsv file.tsv + +Convert rows to objects based on header row +=========================================== + + $ fq -d csv '.[0] as $t | .[1:] | map(with_entries(.key = $t[.key]))' file.csv + diff --git a/format/flac/testdata/help_flac_frame.fqtest b/format/flac/testdata/help_flac_frame.fqtest new file mode 100644 index 00000000..566d1a5a --- /dev/null +++ b/format/flac/testdata/help_flac_frame.fqtest @@ -0,0 +1,20 @@ +$ fq -h flac_frame +flac_frame: FLAC frame decoder + +Options +======= + + bits_per_sample=16 Bits per sample + +Decode examples +=============== + + # Decode file as flac_frame + $ fq -d flac_frame . file + # Decode value as flac_frame + ... | flac_frame + # Decode file using flac_frame options + $ fq -d flac_frame -o bits_per_sample=16 . file + # Decode value as flac_frame + ... | flac_frame({bits_per_sample:16}) + diff --git a/format/macho/macho.md b/format/macho/macho.md index a11a5b70..346a0249 100644 --- a/format/macho/macho.md +++ b/format/macho/macho.md @@ -8,3 +8,8 @@ $ fq '.load_commands[] | select(.cmd=="segment_64")' file ### References - https://github.com/aidansteele/osx-abi-macho-file-format-reference + +### Authors +- Sıddık AÇIL +acils@itu.edu.tr +[@Akaame](https://github.com/Akaame) diff --git a/format/macho/testdata/help_macho.fqtest b/format/macho/testdata/help_macho.fqtest new file mode 100644 index 00000000..1987e260 --- /dev/null +++ b/format/macho/testdata/help_macho.fqtest @@ -0,0 +1,26 @@ +$ fq -h macho +macho: Mach-O macOS executable decoder + +Decode examples +=============== + + # Decode file as macho + $ fq -d macho . file + # Decode value as macho + ... | macho + +Supports decoding vanilla and FAT Mach-O binaries. + +Select 64bit load segments +========================== + + $ fq '.load_commands[] | select(.cmd=="segment_64")' file + +References +========== +- https://github.com/aidansteele/osx-abi-macho-file-format-reference + +Authors +======= +- Sıddık AÇIL acils@itu.edu.tr @Akaame (https://github.com/Akaame) + diff --git a/format/markdown/markdown.jq b/format/markdown/markdown.jq index 6c518005..907f5ce2 100644 --- a/format/markdown/markdown.jq +++ b/format/markdown/markdown.jq @@ -21,7 +21,13 @@ def _markdown_to_text($width; $header_depth): def _f($pln): if type == "string" then gsub("\n"; " ") elif .type == "document" then .children[] | _f("\n\n") - elif .type == "heading" then "#" * (.level+$header_depth), " ", (.children[] | _f("\n\n")), "\n" + elif .type == "heading" then + ( (.children[] | _f("\n\n")) as $title + | $title + , "\n" + , ("=" * ($title | length)) + , "\n" + ) elif .type == "paragraph" then ( ( [.children[] | _f("\n\n")] | join("") diff --git a/format/matroska/matroska.md b/format/matroska/matroska.md index 0ebe2f97..86c81fa1 100644 --- a/format/matroska/matroska.md +++ b/format/matroska/matroska.md @@ -1,10 +1,10 @@ -### Lookup element path using `matroska_path` +### Lookup element using path ```sh $ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv ``` -### Get element path using `matroska_path` +### Get path to element ```sh $ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv diff --git a/format/matroska/testdata/help_matroska.fqtest b/format/matroska/testdata/help_matroska.fqtest new file mode 100644 index 00000000..ef4d880f --- /dev/null +++ b/format/matroska/testdata/help_matroska.fqtest @@ -0,0 +1,29 @@ +$ fq -h matroska +matroska: Matroska file decoder + +Decode examples +=============== + + # Decode file as matroska + $ fq -d matroska . file + # Decode value as matroska + ... | matroska + +Lookup element using path +========================= + + $ fq 'matroska_path(".Segment.Tracks[0)")' file.mkv + +Get path to element +=================== + + $ fq 'grep_by(.id == "Tracks") | matroska_path' file.mkv + +References +========== +- https://tools.ietf.org/html/draft-ietf-cellar-ebml-00 +- https://matroska.org/technical/specs/index.html +- https://www.matroska.org/technical/basics.html +- https://www.matroska.org/technical/codec_specs.html +- https://wiki.xiph.org/MatroskaOpus + diff --git a/format/mp3/testdata/help_mp3.fqtest b/format/mp3/testdata/help_mp3.fqtest new file mode 100644 index 00000000..a618b733 --- /dev/null +++ b/format/mp3/testdata/help_mp3.fqtest @@ -0,0 +1,21 @@ +$ fq -h mp3 +mp3: MP3 file decoder + +Options +======= + + max_sync_seek=32768 Max byte distance to next sync + max_unique_header_configs=5 Max number of unique frame header configs allowed + +Decode examples +=============== + + # Decode file as mp3 + $ fq -d mp3 . file + # Decode value as mp3 + ... | mp3 + # Decode file using mp3 options + $ fq -d mp3 -o max_sync_seek=32768 -o max_unique_header_configs=5 . file + # Decode value as mp3 + ... | mp3({max_sync_seek:32768,max_unique_header_configs:5}) + diff --git a/format/mp4/mp4.md b/format/mp4/mp4.md index fd32c951..8ab20e62 100644 --- a/format/mp4/mp4.md +++ b/format/mp4/mp4.md @@ -1,11 +1,11 @@ -### `mp4_path($path)` - Lookup mp4 box using a mp4 box path. +### Lookup mp4 box using a mp4 box path. ```sh # | mp4_path($path) -> $ fq 'mp4_path(".moov.trak[1]")' file.mp4 ``` -### `mp4_path` - Return mp4 box path for a decode value box. +### Get mp4 box path for a decode value box. ```sh # | mp4_path -> string @@ -18,9 +18,10 @@ $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4 $ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d' ``` -### Don't decode samples and manually decode first sample for first track as a `aac_frame` +### Speed up decoding by not decoding samples ```sh +# manually decode first sample as a aac_frame $ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4 ``` diff --git a/format/mp4/testdata/help_mp4.fqtest b/format/mp4/testdata/help_mp4.fqtest new file mode 100644 index 00000000..0bebd2b7 --- /dev/null +++ b/format/mp4/testdata/help_mp4.fqtest @@ -0,0 +1,54 @@ +$ fq -h mp4 +mp4: ISOBMFF, QuickTime and similar decoder + +Options +======= + + allow_truncated=false Allow box to be truncated + decode_samples=true Decode supported media samples + +Decode examples +=============== + + # Decode file as mp4 + $ fq -d mp4 . file + # Decode value as mp4 + ... | mp4 + # Decode file using mp4 options + $ fq -d mp4 -o allow_truncated=false -o decode_samples=true . file + # Decode value as mp4 + ... | mp4({allow_truncated:false,decode_samples:true}) + +Lookup mp4 box using a mp4 box path. +==================================== + + # | mp4_path($path) -> + $ fq 'mp4_path(".moov.trak[1]")' file.mp4 + +Get mp4 box path for a decode value box. +======================================== + + # | mp4_path -> string + $ fq 'grep_by(.type == "trak") | mp4_path' file.mp4 + +Force decode a single box +========================= + + $ fq -n '"AAAAHGVsc3QAAAAAAAAAAQAAADIAAAQAAAEAAA==" | frombase64 | mp4({force:true}) | d' + +Speed up decoding by not decoding samples +========================================= + + # manually decode first sample as a aac_frame + $ fq -o decode_samples=false '.tracks[0].samples[0] | aac_frame | d' file.mp4 + +Entries for first edit list as values +===================================== + + $ fq 'first(grep_by(.type=="elst").entries) | tovalue' file.mp4 + +References +========== +- ISO/IEC base media file format (MPEG-4 Part 12) (https://en.wikipedia.org/wiki/ISO/IEC_base_media_file_format) +- Quicktime file format (https://developer.apple.com/standards/qtff-2001.pdf) + diff --git a/format/mpeg/testdata/help_aac_frame.fqtest b/format/mpeg/testdata/help_aac_frame.fqtest new file mode 100644 index 00000000..53c11398 --- /dev/null +++ b/format/mpeg/testdata/help_aac_frame.fqtest @@ -0,0 +1,20 @@ +$ fq -h aac_frame +aac_frame: Advanced Audio Coding frame decoder + +Options +======= + + object_type=1 Audio object type + +Decode examples +=============== + + # Decode file as aac_frame + $ fq -d aac_frame . file + # Decode value as aac_frame + ... | aac_frame + # Decode file using aac_frame options + $ fq -d aac_frame -o object_type=1 . file + # Decode value as aac_frame + ... | aac_frame({object_type:1}) + diff --git a/format/mpeg/testdata/help_avc_au.fqtest b/format/mpeg/testdata/help_avc_au.fqtest new file mode 100644 index 00000000..3e986e05 --- /dev/null +++ b/format/mpeg/testdata/help_avc_au.fqtest @@ -0,0 +1,20 @@ +$ fq -h avc_au +avc_au: H.264/AVC Access Unit decoder + +Options +======= + + length_size=4 Length value size + +Decode examples +=============== + + # Decode file as avc_au + $ fq -d avc_au . file + # Decode value as avc_au + ... | avc_au + # Decode file using avc_au options + $ fq -d avc_au -o length_size=4 . file + # Decode value as avc_au + ... | avc_au({length_size:4}) + diff --git a/format/mpeg/testdata/help_hevc_au.fqtest b/format/mpeg/testdata/help_hevc_au.fqtest new file mode 100644 index 00000000..169a1d27 --- /dev/null +++ b/format/mpeg/testdata/help_hevc_au.fqtest @@ -0,0 +1,20 @@ +$ fq -h hevc_au +hevc_au: H.265/HEVC Access Unit decoder + +Options +======= + + length_size=4 Length value size + +Decode examples +=============== + + # Decode file as hevc_au + $ fq -d hevc_au . file + # Decode value as hevc_au + ... | hevc_au + # Decode file using hevc_au options + $ fq -d hevc_au -o length_size=4 . file + # Decode value as hevc_au + ... | hevc_au({length_size:4}) + diff --git a/format/msgpack/testdata/help_msgpack.fqtest b/format/msgpack/testdata/help_msgpack.fqtest new file mode 100644 index 00000000..78082b8b --- /dev/null +++ b/format/msgpack/testdata/help_msgpack.fqtest @@ -0,0 +1,20 @@ +$ fq -h msgpack +msgpack: MessagePack decoder + +Decode examples +=============== + + # Decode file as msgpack + $ fq -d msgpack . file + # Decode value as msgpack + ... | msgpack + +Convert represented value to JSON +================================= + + $ fq -d msgpack torepr file.msgpack + +References +========== +- https://github.com/msgpack/msgpack/blob/master/spec.md + diff --git a/format/protobuf/testdata/help_protobuf.fqtest b/format/protobuf/testdata/help_protobuf.fqtest new file mode 100644 index 00000000..95c9f31c --- /dev/null +++ b/format/protobuf/testdata/help_protobuf.fqtest @@ -0,0 +1,20 @@ +$ fq -h protobuf +protobuf: Protobuf decoder + +Decode examples +=============== + + # Decode file as protobuf + $ fq -d protobuf . file + # Decode value as protobuf + ... | protobuf + +Can decode sub messages +======================= + + $ fq -d protobuf '.fields[6].wire_value | protobuf | d' file + +References +========== +- https://developers.google.com/protocol-buffers/docs/encoding + diff --git a/format/rtmp/testdata/help_rtmp.fqtest b/format/rtmp/testdata/help_rtmp.fqtest new file mode 100644 index 00000000..564abccf --- /dev/null +++ b/format/rtmp/testdata/help_rtmp.fqtest @@ -0,0 +1,18 @@ +$ fq -h rtmp +rtmp: Real-Time Messaging Protocol decoder + +Decode examples +=============== + + # Decode file as rtmp + $ fq -d rtmp . file + # Decode value as rtmp + ... | rtmp + +Current only supports plain RTMP (not RTMPT or encrypted variants etc) with AMF0 (not AMF3). + +References +========== +- https://rtmp.veriskope.com/docs/spec/ +- https://rtmp.veriskope.com/pdf/video_file_format_spec_v10.pdf + diff --git a/format/wasm/testdata/help_wasm.fqtest b/format/wasm/testdata/help_wasm.fqtest new file mode 100644 index 00000000..29cf9f40 --- /dev/null +++ b/format/wasm/testdata/help_wasm.fqtest @@ -0,0 +1,29 @@ +$ fq -h wasm +wasm: WebAssembly Binary Format decoder + +Decode examples +=============== + + # Decode file as wasm + $ fq -d wasm . file + # Decode value as wasm + ... | wasm + +Count opcode usage +================== + + $ fq '.sections[] | select(.id == "code_section") | [.. | .opcode? // empty] | count | map({key: .[0], value: .[1]}) | from_entries' file.wasm + +List exports and imports +======================== + + $ fq '.sections | {import: map(select(.id == "import_section").content.im.x[].nm.b), export: map(select(.id == "export_section").content.ex.x[].nm.b)}' file.wasm + +Authors +======= +- Takashi Oguma @bitbears-dev (https://github.com/bitbears-dev) @0xb17bea125 (https://twitter.com/0xb17bea125) + +References +========== +- https://webassembly.github.io/spec/core/ + diff --git a/format/xml/html.md b/format/xml/html.md index 2d2b4ad3..67c27158 100644 --- a/format/xml/html.md +++ b/format/xml/html.md @@ -51,14 +51,10 @@ $ 'text' | fq -d html -o array=true ] ] ] -``` -```sh -# Decode html files to a {file: "title", ...} object +# decode html files to a {file: "title", ...} object $ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html -``` -```sh # href:s in file $ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html ``` diff --git a/format/xml/testdata/help_html.fqtest b/format/xml/testdata/help_html.fqtest new file mode 100644 index 00000000..41639396 --- /dev/null +++ b/format/xml/testdata/help_html.fqtest @@ -0,0 +1,81 @@ +$ fq -h html +html: HyperText Markup Language decoder + +Options +======= + + array=false Decode as nested arrays + attribute_prefix=@ Prefix for attribute keys + seq=false Use seq attribute to preserve element order + +Decode examples +=============== + + # Decode file as html + $ fq -d html . file + # Decode value as html + ... | html + # Decode file using html options + $ fq -d html -o array=false -o attribute_prefix="@" -o seq=false . file + # Decode value as html + ... | html({array:false,attribute_prefix:"@",seq:false}) + +HTML is decoded in HTML5 mode and will always include , and element. + +See xml format for more examples and how to preserve element order and how to encode to xml. + +There is no tohtml function, see toxml instead. + +Element as object +================= + + # decode as object is the default + $ echo 'text' | fq -d html + { + "html": { + "body": { + "a": { + "#text": "text", + "@href": "url" + } + }, + "head": "" + } + } + +Element as array +================ + + $ 'text' | fq -d html -o array=true + [ + "html", + null, + [ + [ + "head", + null, + [] + ], + [ + "body", + null, + [ + [ + "a", + { + "#text": "text", + "href": "url" + }, + [] + ] + ] + ] + ] + ] + + # decode html files to a {file: "title", ...} object + $ fq -n -d html '[inputs | {key: input_filename, value: .html.head.title?}] | from_entries' *.html + + # href:s in file + $ fq -r -o array=true -d html '.. | select(.[0] == "a" and .[1].href)?.[1].href' file.html + diff --git a/format/xml/testdata/help_xml.fqtest b/format/xml/testdata/help_xml.fqtest new file mode 100644 index 00000000..20232db6 --- /dev/null +++ b/format/xml/testdata/help_xml.fqtest @@ -0,0 +1,124 @@ +$ fq -h xml +xml: Extensible Markup Language decoder + +Options +======= + + array=false Decode as nested arrays + attribute_prefix=@ Prefix for attribute keys + seq=false Use seq attribute to preserve element order + +Decode examples +=============== + + # Decode file as xml + $ fq -d xml . file + # Decode value as xml + ... | xml + # Decode file using xml options + $ fq -d xml -o array=false -o attribute_prefix="@" -o seq=false . file + # Decode value as xml + ... | xml({array:false,attribute_prefix:"@",seq:false}) + +XML can be decoded and encoded into jq values in two ways, elements as object or array. Which variant to use depends a bit what you want to do. The object variant +might be easier to query for a specific value but array might be easier to use to generate xml or to query after all elements of some kind etc. + +Encoding is done using the toxml function and it will figure what variant that is used based on the input value. Is has two optional options indent and +attribute_prefix. + +Elements as object +================== +Element can have different shapes depending on body text, attributes and children: + +- text is {"a":{"#text":"text","@key":"value"}}, has text (#text) and attributes (@key) +- text is {"a":"text"} +- text is {"a":{"b":"text"}} one child with only text and no attributes +- text is {"a":{"b":["","text"]}} two children with same name end up in an array +- text is {"a":{"b":["",{"#text":"text","@key":"value"}]}} + +If there is #seq attribute it encodes the child element order. Use -o seq=true to include sequence number when decoding, otherwise order might be lost. + + + # decode as object is the default + $ echo 'bbbccc' | fq -d xml -o seq=true + { + "a": { + "b": [ + { + "#seq": 0 + }, + { + "#seq": 1, + "#text": "bbb" + } + ], + "c": { + "#seq": 2, + "#text": "ccc", + "@attr": "value" + } + } + } + + # access text of the element + $ echo 'bbbccc' | fq '.a.c["#text"]' + "ccc" + + # decode to object and encode to xml + $ echo 'bbbccc' | fq -r -d xml -o seq=true 'toxml({indent:2})' + + + bbb + ccc + + +Elements as array +================= +Elements are arrays of the shape ["#text": "body text", "attr_name", {key: "attr value"}|null, [, ...]]. + + + # decode as array + ✗ echo 'bbbccc' | fq -d xml -o array=true + [ + "a", + null, + [ + [ + "b", + null, + [] + ], + [ + "b", + { + "#text": "bbb" + }, + [] + ], + [ + "c", + { + "#text": "ccc", + "attr": "value" + }, + [] + ] + ] + ] + + # decode to array and encode to xml + $ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' + + + bbb + ccc + + + # access text of the element, the object variant above is probably easier to use + $ echo 'bbbccc' | fq -o array=true '.[2][2][1]["#text"]' + "ccc" + +References +========== +- xml.com's Converting Between XML and JSON (https://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html) + diff --git a/format/xml/xml.md b/format/xml/xml.md index c483cdd0..d8112f61 100644 --- a/format/xml/xml.md +++ b/format/xml/xml.md @@ -44,9 +44,7 @@ $ echo 'bbbccc' | fq -d xml -o seq=true # access text of the element $ echo 'bbbccc' | fq '.a.c["#text"]' "ccc" -``` -```sh # decode to object and encode to xml $ echo 'bbbccc' | fq -r -d xml -o seq=true 'toxml({indent:2})' @@ -89,11 +87,9 @@ Elements are arrays of the shape `["#text": "body text", "attr_name", {key: "att ] ] ] -``` -```sh # decode to array and encode to xml -✗ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' +$ echo 'bbbccc' | fq -r -d xml -o array=true -o seq=true 'toxml({indent:2})' bbb diff --git a/format/zip/testdata/help_zip.fqtest b/format/zip/testdata/help_zip.fqtest new file mode 100644 index 00000000..7fff18a9 --- /dev/null +++ b/format/zip/testdata/help_zip.fqtest @@ -0,0 +1,27 @@ +$ fq -h zip +zip: ZIP archive decoder + +Options +======= + + uncompress=true Uncompress and probe files + +Decode examples +=============== + + # Decode file as zip + $ fq -d zip . file + # Decode value as zip + ... | zip + # Decode file using zip options + $ fq -d zip -o uncompress=true . file + # Decode value as zip + ... | zip({uncompress:true}) + +Supports ZIP64. + +References +========== +- https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT +- https://opensource.apple.com/source/zip/zip-6/unzip/unzip/proginfo/extra.fld + diff --git a/pkg/interp/help.jq b/pkg/interp/help.jq index 2a3208a1..4ce339b1 100644 --- a/pkg/interp/help.jq +++ b/pkg/interp/help.jq @@ -140,11 +140,13 @@ def _help($arg0; $topic): | (_format_func($f.name; "_help")? // {} | _help_format_enrich($arg0; $f; true)) as $fhelp | ((_registry.files[][] | select(.name=="\($topic).md").data) // false) as $doc | "\($f.name): \($f.description) decoder" + , "" , if $f.decode_in_arg then ( $f.decode_in_arg | to_entries | map([" \(.key)=\(.value) ", $f.decode_in_arg_doc[.key]]) - | "# Options" + | "Options" + , "=======" , "" , table( .; @@ -157,11 +159,12 @@ def _help($arg0; $topic): ) ) | join("") ) + , "" ) else empty end - , "" - , "# Decode examples" + , "Decode examples" + , "===============" , "" , ( $fhelp.examples[] | " # \(.comment)" diff --git a/pkg/interp/testdata/args.fqtest b/pkg/interp/testdata/args.fqtest index 9d71f2f8..b9f08748 100644 --- a/pkg/interp/testdata/args.fqtest +++ b/pkg/interp/testdata/args.fqtest @@ -98,114 +98,6 @@ string_input false unicode false verbose false width 135 -$ fq --help formats -aac_frame Advanced Audio Coding frame -adts Audio Data Transport Stream -adts_frame Audio Data Transport Stream frame -amf0 Action Message Format 0 -apev2 APEv2 metadata tag -ar Unix archive -asn1_ber ASN1 BER (basic encoding rules, also CER and DER) -av1_ccr AV1 Codec Configuration Record -av1_frame AV1 frame -av1_obu AV1 Open Bitstream Unit -avc_annexb H.264/AVC Annex B -avc_au H.264/AVC Access Unit -avc_dcr H.264/AVC Decoder Configuration Record -avc_nalu H.264/AVC Network Access Layer Unit -avc_pps H.264/AVC Picture Parameter Set -avc_sei H.264/AVC Supplemental Enhancement Information -avc_sps H.264/AVC Sequence Parameter Set -avro_ocf Avro object container file -bencode BitTorrent bencoding -bitcoin_blkdat Bitcoin blk.dat -bitcoin_block Bitcoin block -bitcoin_script Bitcoin script -bitcoin_transaction Bitcoin transaction -bsd_loopback_frame BSD loopback frame -bson Binary JSON -bzip2 bzip2 compression -cbor Concise Binary Object Representation -csv Comma separated values -dns DNS packet -dns_tcp DNS packet (TCP) -elf Executable and Linkable Format -ether8023_frame Ethernet 802.3 frame -exif Exchangeable Image File Format -fairplay_spc FairPlay Server Playback Context -flac Free Lossless Audio Codec file -flac_frame FLAC frame -flac_metadatablock FLAC metadatablock -flac_metadatablocks FLAC metadatablocks -flac_picture FLAC metadatablock picture -flac_streaminfo FLAC streaminfo -gif Graphics Interchange Format -gzip gzip compression -hevc_annexb H.265/HEVC Annex B -hevc_au H.265/HEVC Access Unit -hevc_dcr H.265/HEVC Decoder Configuration Record -hevc_nalu H.265/HEVC Network Access Layer Unit -hevc_pps H.265/HEVC Picture Parameter Set -hevc_sps H.265/HEVC Sequence Parameter Set -hevc_vps H.265/HEVC Video Parameter Set -html HyperText Markup Language -icc_profile International Color Consortium profile -icmp Internet Control Message Protocol -icmpv6 Internet Control Message Protocol v6 -id3v1 ID3v1 metadata -id3v11 ID3v1.1 metadata -id3v2 ID3v2 metadata -ipv4_packet Internet protocol v4 packet -ipv6_packet Internet protocol v6 packet -jpeg Joint Photographic Experts Group file -json JavaScript Object Notation -jsonl JavaScript Object Notation Lines -macho Mach-O macOS executable -macho_fat Fat Mach-O macOS executable (multi-architecture) -markdown Markdown -matroska Matroska file -mp3 MP3 file -mp3_frame MPEG audio layer 3 frame -mp4 ISOBMFF, QuickTime and similar -mpeg_asc MPEG-4 Audio Specific Config -mpeg_es MPEG Elementary Stream -mpeg_pes MPEG Packetized elementary stream -mpeg_pes_packet MPEG Packetized elementary stream packet -mpeg_spu Sub Picture Unit (DVD subtitle) -mpeg_ts MPEG Transport Stream -msgpack MessagePack -ogg OGG file -ogg_page OGG page -opus_packet Opus packet -pcap PCAP packet capture -pcapng PCAPNG packet capture -png Portable Network Graphics file -prores_frame Apple ProRes frame -protobuf Protobuf -protobuf_widevine Widevine protobuf -pssh_playready PlayReady PSSH -raw Raw bits -rtmp Real-Time Messaging Protocol -sll2_packet Linux cooked capture encapsulation v2 -sll_packet Linux cooked capture encapsulation -tar Tar archive -tcp_segment Transmission control protocol segment -tiff Tag Image File Format -toml Tom's Obvious, Minimal Language -udp_datagram User datagram protocol -vorbis_comment Vorbis comment -vorbis_packet Vorbis packet -vp8_frame VP8 frame -vp9_cfm VP9 Codec Feature Metadata -vp9_frame VP9 frame -vpx_ccr VPX Codec Configuration Record -wasm WebAssembly Binary Format -wav WAV file -webp WebP image -xing Xing header -xml Extensible Markup Language -yaml YAML Ain't Markup Language -zip ZIP archive $ fq -X exitcode: 2 stderr: