Add tech_docs/linux/jq.md
This commit is contained in:
246
tech_docs/linux/jq.md
Normal file
246
tech_docs/linux/jq.md
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
# Working with `jq` on Debian
|
||||||
|
|
||||||
|
## Introduction to `jq`
|
||||||
|
|
||||||
|
`jq` is a powerful command-line tool used for parsing, filtering, transforming, and analyzing JSON data. It allows you to manipulate JSON in a similar way to how `sed`, `awk`, and `grep` handle text files. This guide will walk you through installing `jq`, basic usage, practical examples, and common use cases.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install `jq` on a Debian-based system, use the following commands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install jq
|
||||||
|
```
|
||||||
|
|
||||||
|
## JSON Examples for Practice
|
||||||
|
|
||||||
|
Here are some sample JSON data structures to practice with:
|
||||||
|
|
||||||
|
### Example 1: Simple JSON Object
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "John Doe",
|
||||||
|
"age": 30,
|
||||||
|
"city": "New York"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 2: JSON Array
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "John Doe",
|
||||||
|
"age": 30,
|
||||||
|
"city": "New York"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jane Smith",
|
||||||
|
"age": 25,
|
||||||
|
"city": "Los Angeles"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sam Brown",
|
||||||
|
"age": 20,
|
||||||
|
"city": "Chicago"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example 3: Nested JSON Object
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Product Name",
|
||||||
|
"price": 29.99,
|
||||||
|
"tags": ["electronics", "gadget"],
|
||||||
|
"stock": {
|
||||||
|
"warehouse": 100,
|
||||||
|
"retail": 50
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Basic `jq` Commands
|
||||||
|
|
||||||
|
### Parsing and Pretty-Printing JSON
|
||||||
|
|
||||||
|
To pretty-print JSON, you can use the `.` filter:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example1.json | jq .
|
||||||
|
```
|
||||||
|
|
||||||
|
### Extracting a Value
|
||||||
|
|
||||||
|
To extract a specific value from a JSON object:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example1.json | jq '.name'
|
||||||
|
```
|
||||||
|
|
||||||
|
For a JSON array, you can extract a specific element by index:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example2.json | jq '.[0].name'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Filtering JSON Arrays
|
||||||
|
|
||||||
|
To filter an array based on a condition:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example2.json | jq '.[] | select(.age > 25)'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Modifying JSON
|
||||||
|
|
||||||
|
To modify a JSON object and add a new field:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example1.json | jq '. + {"country": "USA"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Combining Filters
|
||||||
|
|
||||||
|
You can combine multiple filters to achieve more complex queries:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example3.json | jq '.stock | {total_stock: (.warehouse + .retail)}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Practical Exercises
|
||||||
|
|
||||||
|
### Exercise 1: Extract the Age of "Jane Smith"
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example2.json | jq '.[] | select(.name == "Jane Smith") | .age'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exercise 2: List All Names
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example2.json | jq '.[].name'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exercise 3: Calculate Total Stock
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example3.json | jq '.stock | .warehouse + .retail'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exercise 4: Add a New Tag "sale" to the Tags Array
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat example3.json | jq '.tags += ["sale"]'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common Uses of `jq`
|
||||||
|
|
||||||
|
### Parsing API Responses
|
||||||
|
|
||||||
|
When interacting with web APIs, the responses are often in JSON format. `jq` allows you to parse, filter, and extract the necessary data from these responses.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl -s https://api.example.com/data | jq '.items[] | {name: .name, id: .id}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Processing Configuration Files
|
||||||
|
|
||||||
|
Many modern applications use JSON for configuration. With `jq`, you can easily modify or extract values from these files.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
jq '.settings.debug = true' config.json > new_config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
### Log Analysis
|
||||||
|
|
||||||
|
If your logs are in JSON format, you can use `jq` to search for specific entries, aggregate data, or transform the logs into a more readable format.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat logs.json | jq '.[] | select(.level == "error") | {timestamp: .timestamp, message: .message}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Transformation
|
||||||
|
|
||||||
|
Transforming JSON data into different structures or formats is straightforward with `jq`. This is useful for data pipelines or ETL (Extract, Transform, Load) processes.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat data.json | jq '[.items[] | {name: .name, value: .value}]'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scripting and Automation
|
||||||
|
|
||||||
|
In shell scripts, `jq` can be used to parse and manipulate JSON data as part of automation tasks.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Extracting a value from JSON in a script
|
||||||
|
response=$(curl -s https://api.example.com/data)
|
||||||
|
id=$(echo $response | jq -r '.items[0].id')
|
||||||
|
echo "The ID is: $id"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Testing and Debugging
|
||||||
|
|
||||||
|
When developing applications that produce or consume JSON, `jq` helps in quickly inspecting the JSON output for correctness.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat response.json | jq '.'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Practical Scenarios
|
||||||
|
|
||||||
|
### Working with Kubernetes
|
||||||
|
|
||||||
|
Kubernetes uses JSON and YAML extensively. You can use `jq` to filter and extract information from the JSON output of `kubectl` commands.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl get pods -o json | jq '.items[] | {name: .metadata.name, status: .status.phase}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### CI/CD Pipelines
|
||||||
|
|
||||||
|
In continuous integration and deployment workflows, `jq` can parse and transform JSON data used in configuration files, reports, or environment variables.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo $GITHUB_EVENT_PATH | jq '.commits[] | {message: .message, author: .author.name}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Web Development
|
||||||
|
|
||||||
|
When dealing with front-end and back-end integration, `jq` helps in simulating API responses or transforming data formats.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat mock_response.json | jq '.users[] | {username: .login, email: .email}'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Data Analysis
|
||||||
|
|
||||||
|
For quick analysis of JSON data files, `jq` provides a powerful way to query and aggregate data.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cat data.json | jq '[.records[] | select(.active == true) | .value] | add'
|
||||||
|
```
|
||||||
|
|
||||||
|
### DevOps and Infrastructure Management
|
||||||
|
|
||||||
|
Tools like Terraform and AWS CLI produce JSON output, and `jq` is perfect for extracting and processing this information.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
aws ec2 describe-instances | jq '.Reservations[].Instances[] | {instanceId: .InstanceId, state: .State.Name}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
`jq` is a versatile tool that can be integrated into various workflows to handle JSON data efficiently. Whether you're working with APIs, configuration files, logs, or automation scripts, `jq` helps you parse, filter, and transform JSON data with ease.
|
||||||
|
|
||||||
|
Feel free to modify these examples and try different commands. `jq` has a comprehensive manual that you can refer to for more advanced features:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
man jq
|
||||||
|
```
|
||||||
|
|
||||||
|
Happy learning! If you have any specific questions or need further assistance with `jq`, let me know!
|
||||||
Reference in New Issue
Block a user