前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux 命令 | 每日一学,文本处理之文件内容查看实践

Linux 命令 | 每日一学,文本处理之文件内容查看实践

作者头像
全栈工程师修炼指南
发布2024-09-24 18:35:37
820
发布2024-09-24 18:35:37
举报
文章被收录于专栏:全栈工程师修炼之路

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


0x00 Linux 查看文件内容的命令

cat 命令 - 读取文件内容到屏幕

描述:此命令将读取文件并打印到标准输出设备上(显示、读取或拼接文件内容), 常用来显示文件的内容类似于windows系统里的type命令。

语法参数

代码语言:javascript
复制
# 用法:
cat [选项]... [文件]...
# 参数: 
-A, --show-all           等效于 -vET,显示所有控制字符
-b, --number-nonblank    对非空输出行编号,同时取消 -n 选项效果
-e                       等效于 -vE
-E, --show-ends          在每行结束处显示"$"
-n, --number             对输出的所有行编号
-s, --squeeze-blank      不输出多行空行,即压缩连续的空行为一行
-t                       与 -vT 等效
-T, --show-tabs          将跳格字符显示为^I
-u                       (被忽略)
-v, --show-nonprinting   使用^ 和M- 引用,除了LFD和 TAB 之外

温馨提示:当文件较大的时候建议采用more或者less命令进行查看文件,若文件行数较多时可以采用下述快捷键来停止。

  • 停止滚屏:Ctrl+S
  • 恢复滚屏:Ctrl+Q
  • 终止该命令执行,并返回shell提示符:Ctrl+C (中断)
  • 输入结束符, 表示文件结束:Ctrl+D

实用案例:

代码语言:javascript
复制
# 1.同时显示文件fl.txt和f2.txt的内容
cat f1.txt f2.txt 

# 2.将文件ml和m2合并后放入文件file.txt中
cat m1 m2 > file.txt

# 3.显示文件内容及行数
cat -n /etc/issue
  1  \S
  2  Kernel \r on an \m
  3
# 排除空行显示行数
cat -b /etc/issue
  1  \S
  2  Kernel \r on an \m

# 4.特殊字符的显示
cat -A /etc/pam.conf
# ---------------------------------------------------------------------------#$
# /etc/pam.conf^I^I^I^I^I^I^I^I     #$
# ---------------------------------------------------------------------------#$
#$
# NOTE$
# ----$
#$

# 5.从命令行中获取命令结果字符串以及变量写入文件之中。
# 方式1
cat << EOF > es.env
AUTHOR=${NAME}
$(ip addr)
EOF
# 方式2
cat > demo2.yaml <<EOF
AUTHOR=${NAME}
$(ip addr)
EOF

# 执行结果: name=WeiyiGeek
# 使用cat输出变量到文件时如果是"EOF"并不会将该变量进行赋值改变(小差别值得注意)。
demo="WeiyiGeek"
cat > demo1.yaml <<"EOF"
name=${demo}
EOF
# 执行结果: name=${demo}

# 5.从终端键盘输入字符串到 cat.log 文件中,
cat > write.log
全栈工程师修炼指南
blog.weiyigeek.top
ctrl+d # 结束输入

# 6.实现标准输出和标准错误互换。
(cat /etc/redhat-release /etc/os-release-no 3>&1 1>&2 2>&3 ) > err.log 2> info.log
$ cat err.log
  # cat: /etc/os-release-no: 没有那个文件或目录
$ cat info.log
  # Rocky Linux release 9.3 (Blue Onyx)

# 7.管道符也可以与重定向结合使用实现更改weiyigeek用户密码
cat pass.txt | passwd --stdin weiyigeek &> /dev/null

# 8.使用输入重定向与管道符快速实现资源清单的部署
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: alpine-app
spec:
  containers:
  - name: alpine-app
    image: alpine:latest
    args:
    - sleep
    - "100000"
EOF

weiyigeek.top-cat命令使用案例

tac 命令 - 读取文件并反向输出内容

描述: 此命令将文件从最后一行开始显示到第一行,即是cat命令结果的反向输出。

语法参数:

代码语言:javascript
复制
Usage: tac [OPTION]... [FILE]...
-b # 在连接分离器之前而不是之后
-r|--regex      # 使用正则表达式
-s|--separator  # 指定分隔符

实例演示

示例1.cattac 命令对比显示

代码语言:javascript
复制
# 从首行到末行
$ cat /etc/resolv.conf
nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver fec0:0:0:ffff::1

# 从末行到首行
$ tac /etc/resolv.conf
nameserver fec0:0:0:ffff::1
nameserver 223.6.6.6
nameserver 223.5.5.5

示例2.tac 命令其他使用示例:

代码语言:javascript
复制
# 交互式输入
$ tac
a
bb
ccc
  # ctrl+d # 结束输入
ccc
bb
a

# 管道输入
seq 5 | tac
5
4
3
2
1

rev 命令 - 行内字符串逆向显示

描述:该命令将同一行的内容逆向输出,非常简单。

语法参数

代码语言:javascript
复制
Usage: rev [options] [file ...]

使用示例:

代码语言:javascript
复制
# 交互式
$ echo "hello world!" | rev
!dlrow olleh

# 逆向输出文件内容
$ cat file.txt
abc
1,2,3,4,5,6,7,8,9,10

$ rev file.tx
cba
01,9,8,7,6,5,4,3,2,1

nl 命令 - 显示的时候顺便输出行号

描述: 该命令是添加行号打印;

语法参数:

代码语言:javascript
复制
nl [-bnw] 文件

# 参数:
-b :指定行号指定的方式主要两个中方式
  a : 不论是否有空行页列出行号
  t : 对于空行不列出行号进行跳过
- n : 列出行号的表示方法主要有三种
  ln : 行号在屏幕最左方显示,默认是不带0
  rn : 行号在屏幕tab键+行号显示
  rz : 行号在屏幕最右方显示,使用0向左补齐
- w : 行号字段占用的位数

基础示例:

代码语言:javascript
复制
# 1.列出/etc/issue的内容包括空行行号
$ nl -b a /etc/issue
  1  Ubuntu 20.04 LTS \n \l
  2  Windows WSL
  3

# 2.行号格式设置
$ nl -b a -n rz /etc/issue       # 缺省
000001  Ubuntu 20.04 LTS \n \l
000002  Windows WSL
000003

# 3.行号在屏幕最右方显示右方,指定行号宽度为3
$ nl -b a -n rz -w 3 /etc/issue 
001     Ubuntu 20.04 LTS \n \l
002     Windows WSL
003

more 命令 - 逐页显示文件内容

描述:此命令实现文本文件的逐页显示,使用空格键翻页,回车键换行,按q退出。

温馨提示:more 命令不同于 cat 命令的是,它不是一次性的显示所有文件内容,而是逐页显示文件内容。

语法格式:

代码语言:javascript
复制
# 格式
more [options] <file>...

# 参数
-d         显示翻页并退出提示
-f         计算实际行而不是屏幕行
-l         抑制表单提要后的暂停
-c         不滚动、显示文本和清理行尾
-p         不滚动, 清理屏幕中的显示的文本
-s         将多个空行压缩成一行显示
-u         抑制下划线
-<number>   指定每屏的行数
+<number>   显示指行数后的内容
+/<string>  显示从搜索字符串匹配开始的内容

实例演示

示例1.more 命令使用示例:

代码语言:javascript
复制
$ more -d /var/log/dmesg
  # [    0.000000] kernel: vmware: TSC freq read from hypervisor : 2100.000 MHz
  # --More--(3%)[Press space to continue, 'q' to quit.]

# 2.将文件中的多空行只显示一行
$ more -s a.txt
weiyigeek

公众号:全栈工程师修炼指南

博客:weiyigeek.top

# 3.只显示指定数量的行内容。
$ more -3 a.txt  
weiyigeek

博客:全栈工程师修炼指南

# 4.显示指定行数后的内容
$ more +3 a.txt
全栈工程师修炼指南


weiyigeek.top

less 命令 - 可向前/后显示文件的内容

描述:该命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览,以及快速使用vi进行编辑,所以在日常使用中,less命令比more命令更实用一些。

语法参数:

代码语言:javascript
复制
less [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]
            [-b space] [-h lines] [-j line] [-k keyfile]
            [-{oO} logfile] [-p pattern] [-P prompt] [-t tag]
            [-T tagsfile] [-x tab,...] [-y lines] [-[z] lines]
            [-# shift] [+[+]cmd] [--] [filename]...

# 参数:
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x <数字> 将“tab”键显示为规定的数字空格

快捷按键及其功能:

  • 用 less 命令显示文件时, 用 PageUp键 向上翻页, 用 PageDown键 向下翻页, 要退出less程序, 应按Q键
代码语言:javascript
复制
# 基础操作
b 向前翻一页
f 向后翻一页
u 向前翻半页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
y 向前滚动一行
空格键 滚动一页
回车键 滚动一行
:n - 浏览下一个文件
:p - 浏览前一个文件

# 文件搜索
/ : 使用一个模式进行搜索,并定位到下一个匹配的文本  
? : 使用模式进行搜索,并定位到前一个匹配的文本
n : 向前查找下一个匹配的文本
N : 向后查找前一个匹配的文本

# 全屏导航
ctrl + B :向前移动一屏
ctrl + F :向后移动一屏
ctrl + D :向前移动半屏
ctrl + U :向后移动半屏

j : 向前移动一行
k : 向后移动一行
G : 移动到最后一行
g : 移动到第一行
q / ZZ : 退出 less 命令

# 标记导航 当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置。
ma :使用 a 标记文本的当前位置
'a :导航到标记 a 处'

# 编辑文件
v :进入编辑模式,使用配置的编辑器(nano、vim)编辑当前文件.

实用案例:

代码语言:javascript
复制
# 示例1.一次浏览多个文件。
$ less f1.txt f2.txt

# 当打开多个文件时,使用如下命令在多个文件之间切换
:n - 浏览下一个文件
:p - 浏览前一个文件

# 示例2.正在浏览一个文件时,使用 :e 打开另一个文件。
$ less f1.txt
:e f2.txt

# 示例3.显示行号并且在文件末尾自己关闭文件
less -N -e f1.txt

# 示例4.显示进度百分并进行搜索
less -N -e -m .txt
/UP   # 搜索并高亮显示匹配的文本
/LOWE\S{1}_UP   # LOWER_UP 搜索并高亮显示匹配的文本, n/N 切换搜索方向

# 示例5.配合管道符输出来将其他命令输出的结果进行分页显示
tree -d /etc | less

weiyigeek.top-less示例

head 命令 - 显示从头开始的几行

描述:用于显示文件的开头的内容,在默认情况下,head命令显示文件的头10行内容。如果指定了多于一个文件在每一段输出前会给出文件名作为文件头,如果不指定文件,或者文件为"-",则从标准输入读取数据。

语法参数

代码语言:javascript
复制
用法:head [选项]... [文件]...

# 参数
-数字 :显示行数
-n <数字> :指定文件头部要显示内容的行数;
-c <字节> :指定显示头部内容的字节数K;
-v :总是显示文件名的头信息;
-q : 不显示文件名信息;

# 所给定的数字 K 后面可以附加乘数后缀:b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,GB 1000*1000*1000, G 1024*1024*1024, 对于 T, P, E, Z, Y 同样适用,也可以使用二进制前缀,如:KiB=K,MiB=M 等等。

操作示例

代码语言:javascript
复制
# 1.基础示例
head /etc/passwd     # 缺省显示开头前10行
head -1 /etc/passwd  # 显示指定从开头到k行
head -2 run.js
# const { exec } = require('child_process')
# exec('hexo server -p 80 -d',(error, stdout, stderr) => {

# 2. 除最后10行外,显示剩余全部内容
head -n -10 /etc/passwd 
# 2.1 显示指定数量的行
head -3 /etc/passwd
head -n +3 /etc/passwd

# 3.1个字符占1个字节,注意回车换行各算一个字节
head -c 100 /etc/passwd       #显示前100字节的字符
head -c -100 /etc/passwd      #显示从0到倒数第100字节的字符
# 显示1024字节(1KB)内容
head -c 1024 /etc/passwd

# 4.随机密码生成
$ cat /dev/urandom | tr -dc '[:alnum:][:graph:]'| head -c 10 | tee password.txt | passwd --stdin weiyigeek
$ cat password.txt
^469I`Le_x

weiyigeek.top-heade示例

tail 命令 - 显示从结尾开始显示几行

描述:此命令恰恰与head命令相反,主要用于输入文件中的尾部内容,可以指定开始点将文件标准输出。默认在屏幕上显示指定文件的末尾10行,如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题,如果没有指定文件或者文件名为“-”,则读取标准输入。

温馨提示:在 CentOS8 以前有个tailf命令类似于tail -f,命令效果,当文件不增长时并不访问文件,节约资源,附上一图展示 head 与 tail 命令的区别。

weiyigeek.top-一图展示 head 与 tail 命令图

语法参数:

代码语言:javascript
复制
tail [选项]... [文件]...

# 参数
-c, --bytes=[+]NUM  # 使用 -c +NUM 以输出, 每个文件第 NUM 个字节之后的全部内容
-f, --follow[={name|descriptor}] # 随文件增长即时输出新增数据;若未给定选项参数,则默认使用 'descriptor'(常用)
-F  和 --follow=name --retry 相同
-n, --lines=[+]NUM     # 输出文件的尾部N(N位数字)行内容。  (常用)
--pid=<进程号> # 与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q, --quiet, --silent   # 当有多个文件参数时,不输出各个文件名;
-s, --sleep-interval=N  # 与“-f”选项连用,指定监视文件变化时间隔的秒数; (常用)
-v # 当有多个文件参数时,总是输出各个文件名;
-z, --zero-terminated   #  以 NUL 字符而非换行符作为行尾分隔符

实际案例:

代码语言:javascript
复制
# 1.默认显示文件file的最后10行
tail file 

# 2.显示文件file的内容,从第20行至文件末尾
tail +20 file  

# 3.显示文件file的最后四行
tail -n 4 file 
tail -4 file 

# 4.显示文件file的最后10个字符
tail -c 10 file 

# 5.head与tail联合使用取文件的11行到20行
head -n 20 demo.txt | tail -n 10

# 6.从第二行显示到末尾,以及显示倒数第二行到末尾
tail -n+2 /etc/passwd
cat -n /etc/passwd | tail -n-2
    31  smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
    32  postfix:x:89:89::/var/spool/postfix:/sbin/nologin

# 7.每3秒更新查看文件最后3行
tail -f -n 3 -s 3 /var/log/messages
  # Jun 26 08:01:01 master systemd: Removed slice User Slice of root.
  # Jun 26 09:01:01 master systemd: Created slice User Slice of root.
  # Jun 26 09:01:01 master systemd: Started Session 25 of user root.

# 8.只查看最新生成的文件
tail -0f /var/log/dmesg
tail -f -n0 /var/log/dmesg

# 9.与awk命令联用为持续生成的日志添加上时间戳。
$ tail -0f /tmp/test.log | awk '{print strftime("%F %T%z\t"), $0}'
$ tail -0f /tmp/test.log | awk '{now=strftime("%F %T%z\t");sub(/^/, now); print}'
  # 2024-09-19 10:12:08+0800        公众号:全栈工程师修炼指南

# 10.使用 head  命令与 more 命令联用,可以实时查看日志文件的内容
seq 20 | head -n 6 | tail -n 1
seq 20 | tail -n +6 | head -n 1

注意事项

  • 如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。
  • N值后面可以有后缀:b表示512,k表示1024,m表示1048576(1M)。

watch 命令 - 持续监测命令运行结果

描述:在Linux下此命令主要用于监测一个命令的运行结果,省的你一遍遍的手动运行,它可以是周期性的执行下个程序,并全屏显示执行的结果,例如,持续监控 ls 命令执行后,某个文件的占用磁盘空间的大小变化。

语法参数:

代码语言:javascript
复制
# 格式
watch [参数] [指令]

# 参数:
-n,--interval   # 缺省每2秒运行一下程序,多用于周期性执行命令/定时执行命令。
-d,-differences # 高亮显示变化的区域,而-d = cumulative 选项会把变动过的地方(不管最近的那次有没有变动)都会高亮显示出来。
-t,-no-title    # 关闭watch 命令在顶部的时间间隔命令

实际案例

代码语言:javascript
复制
# 1.每隔两秒钟跳一下最后20行的内容查看事实的信息
watch -n 2 tail -20 /var/log/messages

# 2.每隔一秒高亮显示网络链接数的变化情况 (重要)
watch -n 1 -d netstat  -ant 

# 3.与grep命令联用每隔一秒高亮显示http 链接数的变化情况,后面接的命令若带有管道符,需要加“将命令区域使用 '' 包含”。
watch -n 1 -d ' pstree | grep http ' 

# 4.实时查看模拟攻击客户机建立起来的链接数
watch 'netstat -an | grep :21 | \grep 192.168.12.21 | wc \-l'

# 5.检测当前目录中 scf ' 的文件的变化
watch -d 'ls -l | grep scf'

# 6.10秒一次输出系统的平均负载
watch -n 10 'cat /proc/loadavg'

weiyigeek.top-watch命令使用示例

hexdump 命令 - 以十六进制显示文件内容

描述: 此命令主要用于查看可执行文件内容,并以十六(hex)进行显示,除此之外,还可使用ASCII、十进制、十六进制、八进制转储进行查看。

语法参数:

代码语言:javascript
复制
usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length]
               [-s skip] [file ...]
       hd      [-bcdovx]  [-e fmt] [-f fmt_file] [-n length]
               [-s skip] [file ...]

# 参数
-b      单字节八进制显示。
-c      单个字节字符显示。
-C      使用十六进制和ACSII字符显示。
-d      双字节十进制显示。
-o      双字节八进制显示。
-x      双字节十六进制显示。
-e 格式字符串 指定用于显示数据的格式字符串。
-f 格式文件 指定一个包含一个或多个换行符分隔格式字符串的文件
-n 长度:仅解释输出的长度字节。
-s 偏移:从输入的开头跳过偏移字节。
-v :使hexdump显示所有输入数据。

实用示例:

  • 示例1.使用hexdump查看区分 Windows、Linux 系统下创建的文本内容的差异。
代码语言:javascript
复制
$ cat win.txt.1 ; cat linux.txt
a
b
c
$ file win.txt.1
  win.txt.1: ASCII text, with CRLF line terminators
$ file linux.txt
  linux.txt: ASCII text

$ hexdump win.txt.1
0000000 0d61 620a 0a0d 0d63 000a
0000009
$ hexdump linux.txt
0000000 0a61 0a62 0a63
0000006

# 若要将Window的文本文件转换为Linux格式,可以使用dos2unix命令,反之即unix2dos命令,或 vim 编辑中进行转换。
$ dos2unix win.txt.1
$ unix2dos linux.txt

weiyigeek.top-Windows、Linux 系统下创建的文本内容的差异图

示例2.从管道符以及文件中读取内容。

代码语言:javascript
复制
# 从管道符中读取内容
$ echo {a..z} | tr -d " " | hexdump -C
00000000  61 62 63 64 65 66 67 68  69 6a 6b 6c 6d 6e 6f 70  |abcdefghijklmnop|
00000010  71 72 73 74 75 76 77 78  79 7a 0a                 |qrstuvwxyz.|
0000001b

# 显示长度为512的字节内容
$ hexdump -C -n 256 hello
地址      十六进制                                           acsii 字符                                  
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  03 00 3e 00 01 00 00 00  60 10 00 00 00 00 00 00  |..>.....`.......|
00000020  40 00 00 00 00 00 00 00  78 39 00 00 00 00 00 00  |@.......x9......|

示例3.自定义格式化显示输出

代码语言:javascript
复制
#  Some examples for the -e option:
# hex bytes
echo hello | hexdump -v -e '/1 "%02X "' ; echo
# 68 65 6C 6C 6F 0A

# same, with ASCII section
echo hello world | hexdump -e '8/1 "%02X ""\t"" "' -e '8/1 "%c""\n"'
# 68 65 6C 6C 6F 20 77 6F  hello wo
# 72 6C 64 0A              rld

# hex with preceding 'x'
echo hello | hexdump -v -e '"x" 1/1 "%02X" " "' ; echo
# x68 x65 x6C x6C x6F x0A

# one hex byte per line
echo hello | hexdump -v -e '/1 "%02X\n"'
68
65
6C
6C
6F
0A
`
# byte# & ASCII with control chars(含控制符)
% echo hello | hexdump -v  -e '/1  "%_ad#  "' -e '/1 " _%_u\_\n"'
0#   _h_
1#   _e_
2#   _l_
3#   _l_
4#   _o_
5#   _lf_

# a table of byte#, hex, decimal, octal, ASCII chars (不含控制符)
echo "hello world" | hexdump -v  -e '/1  "%_ad#  "' -e '/1 "hex = 0x%02X"' -e '/1 " dec = %03i "' -e '/1 " oct = %03o"' -e '/1 " -> %c\n"'
0#    68 hex = 104 dec = 150 oct = _h_
1#    65 hex = 101 dec = 145 oct = _e_
2#    6C hex = 108 dec = 154 oct = _l_
3#    6C hex = 108 dec = 154 oct = _l_
4#    6F hex = 111 dec = 157 oct = _o_
5#    0A hex = 010 dec = 012 oct = _

jq 命令 - JSON数据格式化输出

描述:jq它能轻松地把你拥有的数据转换成你期望的格式,而且需要写的程序通常也比你期望的更加简短。它可以对json数据进行分片、过滤、映射和转换,和sed、awk、grep等命令一样,都可以让你轻松地把玩文本。

基础语法:

代码语言:javascript
复制
Usage: jq [options] <jq filter> [file...]
-c 单行输出json字符串;
-n 使用“null”作为单个输入值;
-e 设置输出时候的退出状态码;
-s               read (slurp) all inputs into an array; apply filter to it;
-r               output raw strings, not JSON texts; 输出原始字符串,而不是JSON文本;
-R               read raw strings, not JSON texts;
-C               colorize JSON;
-M               monochrome (dont colorize JSON);
-S               sort keys of objects on output;
--tab            use tabs for indentation;
--arg a v        set variable $a to value <v>;
--argjson a v    set variable $a to JSON value <v>;
--slurpfile a f  set variable $a to an array of JSON texts read from <f>;
--rawfile a f    set variable $a to a string consisting of the contents of <f>;
--args           remaining arguments are string arguments, not files;
--jsonargs       remaining arguments are JSON arguments, not files;

注意事项:

  • jq命令不是系统自带的在linux系统中也可以直接用yum安装
    • 下载页面: https://stedolan.github.io/jq/download/
    • 帮助文档: https://stedolan.github.io/jq/tutorial/
  • jq命令是用C编写没有运行时依赖,所以几乎可以运行在任何系统上。预编译的二进制文件可以直接在Linux、OS X和windows系统上运行,当然在linux和OS X系统你需要赋与其可执行权限;

基础示例:

范例文件(json.txt):

代码语言:javascript
复制
[{"name":"WeiyiGeek","url":"http://tool.chinaz.com","address":{"city":"xiameng","country":"China"},"arrayBrowser":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]},{"name":"WeiyiGeek","url":"http://tool.zzhome.com","address":{"city":"dalian","country":"China"},"arrayBrowser":[{"name":"360","url":"http://www.so.com"},{"name":"bing","url":"http://www.bing.com"}]}]
  1. 最简单的jq程序是表达式"." 个人理解为根,它不改变输入,但可以将其优美地输出便于阅读和理解
代码语言:javascript
复制
echo '{"foo": 0,"bar":1}' | ./jq .
{
  "foo": 0,
  "bar": 1
}

cat > json.txt <<'EOF'
[{
  "name": "WeiyiGeek",
  "url": "http://tool.chinaz.com",
  "address": {
    "city": "厦门",
    "country": "China"
  }
},
{
  "name": "Weiyi",
  "url": "http://tool.chinaz.com",
  "address": {
    "city": "长沙",
    "country": "China"
  }
}]
EOF
  1. 输出列表中的第一个元素,可以使用[index],也可以输出指定字符:
代码语言:javascript
复制
cat json.txt | jq '.' #方式1.可以采用管道符传递数据
jq '.' json.txt       #方式2.美化输出
jq -r '.' json.txt  

#如果json是数组的话,可以采用此种方法;
jq -r '.[0]' json.txt 
jq '.[0]' json.txt
{
  "name": "WeiyiGeek",
  "url": "http://tool.chinaz.com",
  "address": {
    "city": "厦门",
    "country": "China"
  }
}

#遍历访问每个元素的属性
jq -r ".[].name" json.txt
WeiyiGeek
Weiyi

  1. jq支持管道线|,它如同linux命令中的管道线——把前面命令的输出当作是后面命令的输入
代码语言:javascript
复制
cat json.txt | jq '.[0] | {name:.name,city:.address.city}'
{
  "name": "WeiyiGeek",
  "city": "厦门"
}

#值得注意的地方 [] 索引值
cat json.txt | jq '.[0] | {name:.arrayBrowser[1].name,city:.address.city}'
{
  "name": "Baidu",
  "city": "厦门"
}

#遍历数组,注意下面的[]没有加上索引默认是全部满足条件的
cat json.txt | jq ".[] | {name:.arrayBrowser[1].name,city:.address.city}"
{
  "name": "Baidu",
  "city": "厦门"
}
{
  "name": "bing",
  "city": "大连"
}
  1. 如果希望把jq的输出当作一个数组,可以在前后加上[]:
代码语言:javascript
复制
cat json.txt | jq "[.[] | {name:.arrayBrowser[1].name,city:.address.city}]"
[
  {
    "name": "Baidu",
    "city": "厦门"
  },
  {
    "name": "bing",
    "city": "大连"
  }
]
  1. 自定义key在{}中冒号前面的名字是映射的名称,你可以任意修改
代码语言:javascript
复制
cat json.txt | jq "[.[] | {name_001:.arrayBrowser[1].name,city_002:.address.city}]"
[
  {
    "name_001": "Baidu",
    "city_002": "厦门"
  },
  {
    "name_001": "bing",
    "city_002": "大连"
  }
]

# 补充
curl -s -u 'weiyigeek:123456' -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' -X GET https://localhost/v2/library/alpine/manifests/3.12 | jq '.layers[0]'
{
  "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
  "size": 2797541,
  "digest": "sha256:df20fa9351a15782c64e6dddb2d4a6f50bf6d3688060a34c4014b0d9a752eb4c"
}
  1. 内建函数jq还有一些内建函数如 key,has(用来是判断是否存在某个key)
代码语言:javascript
复制
#比如key是用来获取JSON中的key元素的:
$ jq 'keys' json.txt
[
  0,
  1
]

#比如has是用来是判断是否存在某个key,注意这里由于和shell中的{}冲突所以用()
[root@192 ~]# jq 'has(2)' json.txt
false
[root@192 ~]# jq 'has(1)' json.txt
true
  1. 提取指定的多个json字段(重点),遍历数组采用[]
代码语言:javascript
复制
$ jq -r '.[1].name+","+(.[1].url|tostring)' json.txt
Weiyi,http://tool.chinaz.com

$ jq -r '.[].name+","+(.[1].url|tostring)+","+.[].address.city' json.txt
WeiyiGeek,http://tool.chinaz.com,厦门
Weiyi,http://tool.chinaz.com,厦门
WeiyiGeek,http://tool.chinaz.com,长沙
Weiyi,http://tool.chinaz.com,长沙
  1. 调用数组的join方法,来将数组转换成拼接字符串,
代码语言:javascript
复制
jq -r "[.[].name]" json.txt
[
  "WeiyiGeek",
  "Weiyi"
]

#字符串拼接
jq -r '[.[].name]|join(",")' json.txt
WeiyiGeek,Weiyi
  1. 指定格式输出
代码语言:javascript
复制
jq -r '[.[].name,.[].url]|@text' json.txt
["WeiyiGeek","Weiyi","http://tool.chinaz.com","http://tool.chinaz.com"]

jq -r '[.[].name,.[].url]|@text' json.txt
["WeiyiGeek","Weiyi","http://tool.chinaz.com","http://tool.chinaz.com"]

补充说明:

  • 属性名前的点号(.productId)点号表示根节点
  • 字符串拼接采用+将两个字段以及逗号进行拼接;
  • 数值不能直接和字符串进行拼接需要调用tostring的方法进行换行语法为(.click|tostring)
  • 数组访问可以采用[]形式,[]表示遍历整个数组,如果你只想访问数组中的第2个元素(下标从0开始),你可以使用[1];如果想要访问第3个到第5个元素,可以使用[2:4];

附录

官方文档:https://stedolan.github.io/jq/manual

表达式在线测试器:https://jqplay.org/

教程:https://github.com/stedolan/jq/wiki/Cookbook

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈工程师修炼指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 Linux 查看文件内容的命令
    • cat 命令 - 读取文件内容到屏幕
      • tac 命令 - 读取文件并反向输出内容
        • rev 命令 - 行内字符串逆向显示
          • nl 命令 - 显示的时候顺便输出行号
            • more 命令 - 逐页显示文件内容
              • less 命令 - 可向前/后显示文件的内容
                • head 命令 - 显示从头开始的几行
                  • tail 命令 - 显示从结尾开始显示几行
                    • watch 命令 - 持续监测命令运行结果
                      • hexdump 命令 - 以十六进制显示文件内容
                        • jq 命令 - JSON数据格式化输出
                        相关产品与服务
                        容器服务
                        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档