当前位置: 首页 > backend >正文

Linux 文本处理实战手册

一、为什么要掌握这些命令?

本手册将 Linux/Unix 运维与开发中最常用的“筛选、排序、替换”技能浓缩为两份口袋指南:先用 15 分钟掌握 cut、sort、uniq、tr 四个小工具,学会按列截取、排序去重及字符级清洗,并附带可直接套用的组合面试题与实战脚本;再深入 sed,从模式空间原理到增删改查、迁移、就地编辑及生产脚本,教你用一行 sed 解决原本需要写脚本的问题,新手可入门,老手可备忘,打开终端敲一遍就能体会“所谓高效运维,其实就是把文本玩到极致”。

二、四小工具:cut / sort / uniq / tr

命令作用典型场景
cut按列/字符截取取用户名、取 IP
sort排序按 UID 排序、去重前排序
uniq去重计数统计访问 IP、登录用户
tr字符级替换/删除/压缩大小写转换、删除回车

2.1 cut —— 截取列

cut -d':' -f1 /etc/passwd          # 用户名
cut -d':' -f1,3 /etc/passwd        # 用户名 + UID
cut -c2 chinese.txt                # 每行第 2 个字符(中文用 -c)

按照冒号截取

截取第一列和第三列

截取1到4列

cut -b 截取英文字符


[root@zard3 shelldemo]# cut -b 3 test2.txt
ee
e
o
e
=
w
to
o
A
b
s
cut -c 截取中文字符

文本如下

[root@zard3 shelldemo]# cut -c 2 test3.txt 
诚
雨
程
祥
瀚
潮

但是,cut -b不适合中文

[root@zard3 shelldemo]# cut -b 2 test3.txt ­# 运行结果啥也没有

⚠️ cut 只能处理「单字符分隔」的文本。

2.2 sort —— 排序

sort file                          # 按字典序
sort -t: -k3 -n /etc/passwd        # 以冒号分隔,按第 3 列数值升序
sort -nr -k5 -o result.log log     # 降序并落盘
sort 按字符排序

sort -n 按照数字大小升序

sort -nr 降序排列

sort -u去重

运行
[root@zard3 shelldemo]# sort -u test4.txt 
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
test3:x:1004:1004::/home/test3:/bin/bash
test4:x:1005:1005::/home/test4:/bin/bash
zard111:x:1003:1003::/home/zard111:/bin/bash

2.3 uniq —— 去重计数

uniq 只能去相邻重复 → 先 sort 再 uniq 成了铁律。

sort fruit.txt | uniq -c          # 每行出现次数
sort fruit.txt | uniq -d          # 只显示重复行
who | awk '{print $1}' | sort | uniq   # 当前在线用户
uniq 仅仅去重复
[root@zard3 shelldemo]# uniq test5.txt 
pple
apple
peache
pear
banana
cherry
banana
orange

全局去重

[root@zard3 shelldemo]# sort test5.txt |uniq
apple
banana
cherry
orange
peache
pear
uniq -c 统计重复的次数

文本

[root@zard3 shelldemo]# cat test5.txt 
apple
apple
peache
pear
banana
cherry
cherry
banana
orange

命令

# 全局去重,并统计每行出现的次数
[root@zard3 shelldemo]# sort test5.txt |uniq -c2 apple2 banana2 cherry1 orange1 peache1 pear
uniq -d 只显示重复行
[root@zard3 shelldemo]# sort test5.txt |uniq -d
apple
banana
cherry
uniq -u 显示不重复的行
[root@zard3 shelldemo]# cat test5.txt |sort |uniq -u
orange
peache
pear

2.4 tr —— 字符级替换/删除/压缩

bash

复制

tr 'a-z' 'A-Z' < fruit.txt        # 小写 → 大写
tr -d '\n' < file                 # 删除换行
tr -s ' '                         # 把连续空格压成一个

文本 同上

替换是一一对应的字母替换

[root@zard3 shelldemo]# cat test5.txt |tr "a-z" "A-Z"
APPLE
APPLE
PEACHE
PEAR
BANANA
CHERRY
CHERRY
BANANA
ORANGE
a替换成s,p替换成a,le替换成r
[root@zard3 shelldemo]# cat test5.txt |tr "apple" "star"
saarr
saarr
arschr
arsr
bsnsns
chrrry
chrrry
bsnsns
orsngr

三、sed 流编辑器

3.1 工作模型(背下来)

  1. 读一行 → 2. 模式空间 → 3. 执行脚本 → 4. 输出 → 5. 清空 → 循环

默认不改原文件,加 -i 才真正落盘。

3.2 高频指令模板

任务模板例子
删行sed '/pattern/d'sed '/^$/d' 删空行
替换sed 's/old/new/g'sed -i.bak 's/SELINUX=disabled/enable/' /etc/selinux/config
打印sed -n '3,5p'输出 3-5 行
迁移sed '/pat/{H;d};$G'含 pat 的行移到末尾
脚本sed -f script.sed file多条指令复用
[root@zard3 shelldemo]# cat passwd.txt 1	root:x:0:0:root:/root:/bin/bash2	bin:x:1:1:bin:/bin:/sbin/nologin3	daemon:x:2:2:daemon:/sbin:/sbin/nologin4	adm:x:3:4:adm:/var/adm:/sbin/nologin5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6	sync:x:5:0:sync:/sbin:/bin/sync7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8	halt:x:7:0:halt:/sbin:/sbin/halt9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10	operator:x:11:0:operator:/root:/sbin/nologin11	games:x:12:100:games:/usr/games:/sbin/nologin12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13	nobody:x:99:99:Nobody:/:/sbin/nologin14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15	dbus:x:81:81:System message bus:/:/sbin/nologin16	polkitd:x:999:998:User for polkitd:/:/sbin/nologin17	libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin18	colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin19	rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin20	saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin21	gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin22	saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin23	abrt:x:173:173::/etc/abrt:/sbin/nologin24	setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin25	rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin26	pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin27	radvd:x:75:75:radvd user:/:/sbin/nologin28	chrony:x:992:987::/var/lib/chrony:/sbin/nologin29	unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin30	qemu:x:107:107:qemu user:/:/sbin/nologin31	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin32	sssd:x:990:984:User for sssd:/:/sbin/nologin33	usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin34	geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin35	ntp:x:38:38::/etc/ntp:/sbin/nologin36	gdm:x:42:42::/var/lib/gdm:/sbin/nologin37	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin38	nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin39	gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin40	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin41	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin42	postfix:x:89:89::/var/spool/postfix:/sbin/nologin43	tcpdump:x:72:72::/:/sbin/nologin44	zard3:x:1000:1000:ZARD3:/home/zard3:/bin/bash45	test1:x:1001:1001::/home/test1:/bin/bash46	tom:x:1002:1002::/home/tom:/bin/bash47	mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false48	named:x:25:25:Named:/var/named:/sbin/nologin49	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin50	zard111:x:1003:1003::/home/zard111:/bin/bash51	test3:x:1004:1004::/home/test3:/bin/bash52	test4:x:1005:1005::/home/test4:/bin/bash
sed -n "p" passwd.txt 输出的结果和cat一样
[root@zard3 shelldemo]# sed -n "p" passwd.txt 1	root:x:0:0:root:/root:/bin/bash2	bin:x:1:1:bin:/bin:/sbin/nologin3	daemon:x:2:2:daemon:/sbin:/sbin/nologin4	adm:x:3:4:adm:/var/adm:/sbin/nologin5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6	sync:x:5:0:sync:/sbin:/bin/sync7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8	halt:x:7:0:halt:/sbin:/sbin/halt9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10	operator:x:11:0:operator:/root:/sbin/nologin11	games:x:12:100:games:/usr/games:/sbin/nologin12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13	nobody:x:99:99:Nobody:/:/sbin/nologin14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15	dbus:x:81:81:System message bus:/:/sbin/nologin16	polkitd:x:999:998:User for polkitd:/:/sbin/nologin17	libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin18	colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin19	rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin20	saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin21	gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin22	saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin23	abrt:x:173:173::/etc/abrt:/sbin/nologin24	setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin25	rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin26	pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin27	radvd:x:75:75:radvd user:/:/sbin/nologin28	chrony:x:992:987::/var/lib/chrony:/sbin/nologin29	unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin30	qemu:x:107:107:qemu user:/:/sbin/nologin31	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin32	sssd:x:990:984:User for sssd:/:/sbin/nologin33	usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin34	geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin35	ntp:x:38:38::/etc/ntp:/sbin/nologin36	gdm:x:42:42::/var/lib/gdm:/sbin/nologin37	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin38	nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin39	gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin40	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin41	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin42	postfix:x:89:89::/var/spool/postfix:/sbin/nologin43	tcpdump:x:72:72::/:/sbin/nologin44	zard3:x:1000:1000:ZARD3:/home/zard3:/bin/bash45	test1:x:1001:1001::/home/test1:/bin/bash46	tom:x:1002:1002::/home/tom:/bin/bash47	mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false48	named:x:25:25:Named:/var/named:/sbin/nologin49	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin50	zard111:x:1003:1003::/home/zard111:/bin/bash51	test3:x:1004:1004::/home/test3:/bin/bash52	test4:x:1005:1005::/home/test4:/bin/bash
sed -n "10p" passwd.txt 输入第十行
[root@zard3 shelldemo]# sed -n "10p" passwd.txt 10	operator:x:11:0:operator:/root:/sbin/nologin
sed -n "4,6p" passwd.txt 输入4-6行
[root@zard3 shelldemo]# sed -n "4,6p" passwd.txt 4	adm:x:3:4:adm:/var/adm:/sbin/nologin5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin6	sync:x:5:0:sync:/sbin:/bin/sync
sed -n "p;n" passwd.txt  输入所有的奇数行
[root@zard3 shelldemo]# sed -n "p;n" passwd.txt 1	root:x:0:0:root:/root:/bin/bash3	daemon:x:2:2:daemon:/sbin:/sbin/nologin5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11	games:x:12:100:games:/usr/games:/sbin/nologin13	nobody:x:99:99:Nobody:/:/sbin/nologin15	dbus:x:81:81:System message bus:/:/sbin/nologin17	libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin19	rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin21	gluster:x:995:992:GlusterFS daemons:/run/gluster:/sbin/nologin23	abrt:x:173:173::/etc/abrt:/sbin/nologin25	rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin27	radvd:x:75:75:radvd user:/:/sbin/nologin29	unbound:x:991:986:Unbound DNS resolver:/etc/unbound:/sbin/nologin31	tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin33	usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin35	ntp:x:38:38::/etc/ntp:/sbin/nologin37	rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin39	gnome-initial-setup:x:988:982::/run/gnome-initial-setup/:/sbin/nologin41	avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin43	tcpdump:x:72:72::/:/sbin/nologin45	test1:x:1001:1001::/home/test1:/bin/bash47	mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false49	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin51	test3:x:1004:1004::/home/test3:/bin/bash
sed -n "n;p" passwd.txt 显示所有的偶数行
[root@zard3 shelldemo]# sed -n "n;p" passwd.txt 2	bin:x:1:1:bin:/bin:/sbin/nologin4	adm:x:3:4:adm:/var/adm:/sbin/nologin6	sync:x:5:0:sync:/sbin:/bin/sync8	halt:x:7:0:halt:/sbin:/sbin/halt10	operator:x:11:0:operator:/root:/sbin/nologin12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin14	systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin16	polkitd:x:999:998:User for polkitd:/:/sbin/nologin18	colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin20	saned:x:996:993:SANE scanner daemon user:/usr/share/sane:/sbin/nologin22	saslauth:x:994:76:Saslauthd user:/run/saslauthd:/sbin/nologin24	setroubleshoot:x:993:990::/var/lib/setroubleshoot:/sbin/nologin26	pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin28	chrony:x:992:987::/var/lib/chrony:/sbin/nologin30	qemu:x:107:107:qemu user:/:/sbin/nologin32	sssd:x:990:984:User for sssd:/:/sbin/nologin34	geoclue:x:989:983:User for geoclue:/var/lib/geoclue:/sbin/nologin36	gdm:x:42:42::/var/lib/gdm:/sbin/nologin38	nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin40	sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin42	postfix:x:89:89::/var/spool/postfix:/sbin/nologin44	zard3:x:1000:1000:ZARD3:/home/zard3:/bin/bash46	tom:x:1002:1002::/home/tom:/bin/bash48	named:x:25:25:Named:/var/named:/sbin/nologin50	zard111:x:1003:1003::/home/zard111:/bin/bash52	test4:x:1005:1005::/home/test4:/bin/bash
sed -n "1,12{p;n}" passwd.txt  输出1-12行所有的奇数行
[root@zard3 shelldemo]# sed -n "1,12{p;n}" passwd.txt 1	root:x:0:0:root:/root:/bin/bash3	daemon:x:2:2:daemon:/sbin:/sbin/nologin5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin11	games:x:12:100:games:/usr/games:/sbin/nologin
sed -n "1,12{n;p}" passwd.txt 输出1-12行所有的偶数行
[root@zard3 shelldemo]# sed -n "1,12{n;p}" passwd.txt 2	bin:x:1:1:bin:/bin:/sbin/nologin4	adm:x:3:4:adm:/var/adm:/sbin/nologin6	sync:x:5:0:sync:/sbin:/bin/sync8	halt:x:7:0:halt:/sbin:/sbin/halt10	operator:x:11:0:operator:/root:/sbin/nologin12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
sed -n '45,${p}' passwd.txt  打印45行之后的所有行
[root@zard3 shelldemo]# sed -n '45,${p}' passwd.txt 45	test1:x:1001:1001::/home/test1:/bin/bash46	tom:x:1002:1002::/home/tom:/bin/bash47	mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false48	named:x:25:25:Named:/var/named:/sbin/nologin49	apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin50	zard111:x:1003:1003::/home/zard111:/bin/bash51	test3:x:1004:1004::/home/test3:/bin/bash52	test4:x:1005:1005::/home/test4:/bin/bash
sed -n '/the/p' test2.txt  带有the的每一行
[root@zard3 shelldemo]# sed -n '/the/p' test2.txt 4	the tongue is boneless but it breaks bones.12! 5	google is the best tools for search keyword.6	The year ahead will test our political establishment to the limit.
sed -n '4,/the/p' test2.txt 以第四行作为起点,到第一次出现the的行
[root@zard3 shelldemo]# sed -n '4,/the/p' test2.txt 4	the tongue is boneless but it breaks bones.12! 5	google is the best tools for search keyword.
sed -n '/the/=' test2.txt 出现the的行号
[root@zard3 shelldemo]# sed -n '/the/=' test2.txt 
4
5
6
sed -n '/^PI/p' test1.txt 找到开头为PI的行
[root@zard3 shelldemo]# sed -n '/^PI/p' test1.txt 
PI=3.141592653589793238462643383249901429
nl test1.txt|sed '6d' 删除第六行
[root@zard3 shelldemo]# nl test1.txt|sed '6d'1	he was short and fat.2	He was wearing a blue polo shirt with black pants. 3	The home of Football on BBC Sport online.4	the tongue is boneless but it breaks bones.12! 5	google is the best tools for search keyword.7	PI=3.1415926535897932384626433832499014298	a wood cross!9	Actions speak louder than words10	#woood #11	#woooooood 12	# AxyzxyzxyzxyzC13	I bet this place is really spooky late at night! 14	Misfortunes never come alone/single.
sed '/^[a-z]/d' test1.txt 删除所有的以小写字母开头的行
[root@zard3 shelldemo]# sed '/^[a-z]/d' test1.txt 
He was wearing a blue polo shirt with black pants. 
The home of Football on BBC Sport online.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
Actions speak louder than words#woood #
#woooooood 
# AxyzxyzxyzxyzC
I bet this place is really spooky late at night! 
Misfortunes never come alone/single.
sed '/\.$/d' test2.txt 删除所有以.结尾的行
[root@zard3 shelldemo]# sed '/\.$/d' test2.txt 2	He was wearing a blue polo shirt with black pants. 4	the tongue is boneless but it breaks bones.12! 7	PI=3.1415926535897932384626433832499014298	a wood cross!9	Actions speak louder than words10	11	12	#woood #13	#woooooood 14	# AxyzxyzxyzxyzC15	I bet this place is really spooky late at night! 
sed '/^$/d' test1.txt 删除所有的空行
[root@zard3 shelldemo]# sed '/^$/d' test1.txt 
he was short and fat.
He was wearing a blue polo shirt with black pants. 
The home of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12! 
google is the best tools for search keyword.
The year ahead will test our political establishment to the limit.
PI=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood 
# AxyzxyzxyzxyzC
I bet this place is really spooky late at night! 
Misfortunes never come alone/single.
sed '/the/{H;d}; $G' test1.txt 将包含the 的行迁移至文件末尾,{;}用于多个操作

sed '/the/w the.file' test2.txt  将包含the的行转移到the.file

sed -i.bak 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config 替换

 sed '8a+句子' test2.txt 在第八行下面加一句话

 sed '/the/a+句子' test2.txt 在含有the的句子下面加一句话

3.3 生产案例

  1. 一键修改网卡 IP        

    sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
  2. Apache 改监听地址 + 端口

    bash

    复制

    sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
  3. vsftpd 安全加固脚本(禁止匿名、允许本地)

    bash

    复制

    #!/bin/bash
    CONFIG=/etc/vsftpd/vsftpd.conf
    [ ! -f $CONFIG.bak ] && cp $CONFIG $CONFIG.bak
    sed -e '/^anonymous_enable/s/YES/NO/' \-e '/^local_enable/s/NO/YES/' \-e '/^write_enable/s/NO/YES/' $CONFIG > tmp
    mv tmp $CONFIG
    systemctl restart vsftpd

总结

        经过两套速查资料的梳理,我们已经把 Linux 文本处理的核心武器握在手中:cut 精准截取列,sort 与 uniq 联手完成排序与去重,tr 在字符级别做替换、删除与压缩,而 sed 则凭借“模式空间”机制,提供行级乃至跨行级的增删改查、迁移与就地编辑能力。
它们的组合套路可以归纳为一句话——先用 cut/sort/uniq/tr 完成“数据清洗”,再用 sed 做“结构重塑”。面对日志、配置、监控输出或任何纯文本场景,只要记住这条流水线,就能在 1~3 行命令内完成传统脚本几十行才能实现的任务。
下一步建议把示例亲手敲一遍,将命令固化为肌肉记忆,并在生产环境中大胆实践:在线扩容配置文件、批量替换 IP、实时统计连接数……你会发现,所谓高效运维,不过是把文本玩到极致。

http://www.xdnf.cn/news/19562.html

相关文章:

  • 销售事业十年规划,并附上一套能帮助销售成长的「软件工具组合」
  • 爬虫实战练习
  • C 基础(1) - 初识C语言
  • 2025年数字化转型关键证书分析与选择指南
  • compile_commands.json 文件详解
  • Linux基础2
  • (3dnr)多帧视频图像去噪 (一)
  • GDAL 简介
  • C++ multiset数据结构的使用情况说明
  • 基于单片机智能饮水机/智能热水壶
  • 正式发布!2025AI SEO公司哪家专业?
  • 【数据分享】多份土地利用矢量shp数据分享-澳门
  • C# FlaUI win 自动化框架,介绍
  • 员工自愿放弃社保,企业给补贴合法吗?
  • Vue3 中 Proxy 在组件封装中的妙用
  • Windows 使用 Compass 访问MongoDb
  • 【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解
  • 笔记:现代操作系统:原理与实现(1)
  • 卷积神经网络中的两个重要概念——感受野receptive filed和损失函数loss function
  • 【Element Plus `el-select` 下拉菜单响应式定位问题深度解析】
  • 刘洋洋《一笔相思绘红妆》上线,献给当代痴心人的一封情书
  • CUDA编程11 - CUDA异步执行介绍
  • Java 不支持在非静态内部类中声明静态 Static declarations in inner classes are not supported异常处理
  • elasticsearch中文分词器analysis-ik使用
  • Uniapp 生命周期详解:页面生命周期 vs 应用生命周期(附实战示例)
  • 大模型应用开发面试实录:LLM原理、RAG工程与多Agent场景化落地解析
  • gh-pages部署github page项目
  • DAY 20 奇异值SVD分解-2025.9.1
  • 计组(2)CPU与指令
  • (ssh客户端)远程连接工具windterm使用教程(ssh工具、远程工具)