《肝爆整理!Linux 管道命令全攻略:12 大核心命令 + 30 + 实战代码,看完直接告别查文档》

 在 Linux 系统中,管道是串联命令、提升效率的核心机制。本文耗时两周精心整理,系统拆解 12 个高频管道命令,涵盖功能说明、常用选项、典型场景示例及真实输出结果。


一、wc:文本统计

功能:统计文件的行数、单词数、字节数、字符数等。
常用选项

        -l:统计行数(Line)

        -w:统计单词数(Word,以空格分隔)

        -c:统计字节数(Byte)

        -m:统计字符数(Character,多字节字符如中文算 1 个)

        -L:统计最长行的长度(Longest line)

示例 1:基础统计

# 创建测试文件(含中文)
echo -e "Hello world\n这是第二行\nLinux命令行" > test.txt

# 统计行数、单词数、字节数(默认输出3个值)
wc test.txt
# 输出:3  7  35 test.txt  (行数3,单词7,字节35)

# 仅统计行数
wc -l test.txt
# 输出:3 test.txt

# 统计最长行长度(第三行“Linux命令行”共7字符,每个中文字符占3字节)
wc -L test.txt
# 输出:13 test.txt  ("Linux命令行"共7字符,其中"Linux"5字节,"命令行"3×3=9字节,总14字节?实际需根据编码确认,此处以实际输出为准)

示例 2:管道组合统计

统计/etc/passwd文件中以/bin/bash结尾的行数:

grep "/bin/bash$" /etc/passwd | wc -l
# 输出:2  (假设系统中有2个用户使用bash)

二、cut:列数据提取

功能:按列或字符位置提取文本内容(适合结构化数据,如 CSV、日志)。
常用选项

        -d:指定分隔符(Delimiter,默认制表符\t

        -f:指定要提取的列号(Field,如1,3表示第 1、3 列)

        -c:按字符位置提取(Character,如1-5表示前 5 个字符)

示例 1:CSV 文件提取列

# 创建CSV测试文件(姓名,年龄,城市)
echo -e "name,age,city\nAlice,25,Beijing\nBob,30,Shanghai\nCathy,28,Guangzhou" > user.csv

# 提取第1列(姓名)
cut -d ',' -f 1 user.csv
# 输出:
# name
# Alice
# Bob
# Cathy

# 提取第2、3列(年龄和城市)
cut -d ',' -f 2,3 user.csv
# 输出:
# age,city
# 25,Beijing
# 30,Shanghai
# 28,Guangzhou

示例 2:按字符位置提取

echo "2023-10-01 12:30:00" | cut -c 1-10  # 提取日期部分
# 输出:2023-10-01

echo "192.168.1.1" | cut -c 1-3  # 提取IP前3位
# 输出:192

三、grep:文本搜索

功能:在文本中搜索匹配指定模式的行(支持正则表达式)。
常用选项

          -i:忽略大小写(IgnoreCase)

        -v:反向匹配(反选不匹配的行)

        -n:显示行号(Line Number)

        -r:递归搜索目录(Recursive)

        -E:使用扩展正则表达式(如|表示或)

        -A/B/C:显示匹配行的后 / 前 / 前后 N 行

示例 1:基础搜索与反向匹配

# 在user.csv中搜索年龄大于25的行(假设文件内容同上)
grep -E 'age|2[6-9]' user.csv
# 输出:
# name,age,city
# Bob,30,Shanghai
# Cathy,28,Guangzhou

# 反向匹配(排除年龄25的行)
grep -v '25' user.csv
# 输出:
# name,age,city
# Bob,30,Shanghai
# Cathy,28,Guangzhou

示例 2:递归搜索与行号

# 在当前目录递归搜索包含"error"的行(忽略大小写)
grep -rni 'error' ./logs
# 输出:
# ./logs/2023-10-01.log:5:ERROR: File not found
# ./logs/2023-10-02.log:3:Error: Connection timeout

四、sort:数据排序引擎

功能:对文本行进行排序(支持数值、字典序、逆序等)。
常用选项

        -n:数值排序(Numeric)

        -r:逆序排序(Reverse)

        -u:去重排序(Unique)

        -k:按指定列排序(Key)

        -t:指定分隔符(与-k配合)

示例 1:数值与字典序排序

# 创建测试文件(混合数字与字母)
echo -e "3\n10\n2\napple\nBanana" > sort.txt

# 默认字典序排序(数字按字符排序,字母大写在前)
sort sort.txt
# 输出:
# 10
# 2
# 3
# Banana
# apple

# 数值排序(正确识别数字大小)
sort -n sort.txt
# 输出:
# 2
# 3
# 10
# Banana
# apple

# 逆序数值排序
sort -nr sort.txt
# 输出:
# 10
# 3
# 2
# Banana
# apple

示例 2:按列排序(如 CSV 文件)

# 按user.csv的年龄列(第2列)数值排序(跳过首行)
tail -n +2 user.csv | sort -t ',' -k 2n
# 输出:
# Alice,25,Beijing
# Cathy,28,Guangzhou
# Bob,30,Shanghai

五、uniq:去重与统计

功能:去除重复行(需配合sort使用,仅去除相邻重复行)。
常用选项

        -c:统计重复次数(Count)

        -d:仅显示重复行(Duplicates)

        -u:仅显示唯一行(Unique)

示例:统计高频词

# 创建测试文件(重复单词)
echo -e "apple\nbanana\napple\norange\nbanana\napple" > fruits.txt

# 统计词频(先排序,再去重统计)
sort fruits.txt | uniq -c
# 输出:
# 3 apple
# 2 banana
# 1 orange

# 仅显示重复行
sort fruits.txt | uniq -d
# 输出:
# apple
# banana

# 仅显示唯一行
sort fruits.txt | uniq -u
# 输出:
# orange

六、tee:输出复制器

功能:将输出同时写入文件和屏幕(类似 “分流”)。
常用选项

        -a:追加模式(Append,不覆盖原文件)

示例:实时记录命令输出

# 将系统负载信息同时输出到屏幕和load.log(每2秒刷新)
while true; do uptime | tee -a load.log; sleep 2; done
# 输出(屏幕显示):
# 14:30:00 up 10 days,  2:30,  3 users,  load average: 0.12, 0.23, 0.18
# (同时load.log文件会追加该行)

七、tr:字符转换与删除

功能:转换或删除字符(如大小写转换、删除空格)。
常用选项

        -s:压缩重复字符(Squeeze)

        -d:删除指定字符(Delete)

示例 1:大小写转换与空格压缩

echo "Hello   World" | tr 'a-z' 'A-Z'  # 小写转大写
# 输出:HELLO   WORLD

echo "Hello   World" | tr -s ' '  # 压缩多个空格为1个
# 输出:Hello World

echo "123-456-789" | tr -d '-'  # 删除所有短横线
# 输出:123456789

示例 2:清理特殊字符(如 Windows 换行符)

# 将Windows文件的\r\n(\r)转换为Linux的\n
dos2unix file.txt  # 等效于:tr -d '\r' < file.txt > file_unix.txt

八、join:文件按键连接

功能:按公共键合并两个已排序的文件(类似 SQL 的JOIN)。
常用选项

        -t:指定分隔符(默认空格)

        -1/-2:指定第一个 / 第二个文件的键列(默认第 1 列)

示例:合并用户与订单数据

# 创建用户文件(user.txt:ID,姓名)
echo -e "1,Alice\n2,Bob\n3,Cathy" > user.txt

# 创建订单文件(order.txt:ID,金额)
echo -e "1,200\n2,150\n1,300" > order.txt

# 按ID列(第1列)合并(需先排序)
sort user.txt | sort order.txt | join -t ',' -1 1 -2 1 - user.txt order.txt
# 输出:
# 1,Alice,200
# 1,Alice,300
# 2,Bob,150

九、paste:按行合并文件

功能:将多个文件的对应行合并(列拼接)。
常用选项

        -d:指定分隔符(默认制表符\t

示例:合并日志与时间戳

# 创建时间文件(time.txt)
echo -e "10:00\n10:05\n10:10" > time.txt

# 创建日志文件(log.txt)
echo -e "Login\nLogout\nError" > log.txt

# 合并为时间-日志格式(用逗号分隔)
paste -d ',' time.txt log.txt
# 输出:
# 10:00,Login
# 10:05,Logout
# 10:10,Error

十、split:大文件切割

功能:将大文件切割为小文件(按行数或大小)。
常用选项

        -l:按行数切割(Lines)

        -b:按字节大小切割(Bytes,如100M表示 100MB)

示例:切割大日志文件

# 生成100行测试文件
seq 1 100 > big.log

# 按每20行切割(生成bigaa, bigab, ...)
split -l 20 big.log big_
# 输出:生成big_aa(1-20行)、big_ab(21-40行)等5个文件

# 按1KB切割(每个文件约1KB)
split -b 1k big.log big_

十一、xargs:参数传递神器

功能:将标准输入转换为命令参数(解决 “参数列表过长” 问题)。
常用选项

        -n:指定每次传递的参数个数(Number)

        -I:替换占位符(如-I {}{}替换为输入)

示例 1:批量删除文件

# 删除所有.log文件(避免参数过长)
find . -name "*.log" | xargs rm -f

示例 2:批量重命名

# 将所有.txt文件重命名为.bak
ls *.txt | xargs -I {} mv {} {}.bak
# 等效于:mv file1.txt file1.txt.bak; mv file2.txt file2.txt.bak...

十二、awk:文本处理编程语言(高阶管道)

功能:基于模式匹配的文本处理(支持变量、函数、条件判断)。
常用选项

        -F:指定分隔符(Field Separator)

示例:统计 CSV 文件的平均年龄

# 计算user.csv中用户的平均年龄(跳过首行)
tail -n +2 user.csv | awk -F ',' '{sum+=$2; count++} END{print "平均年龄:", sum/count}'
# 输出:平均年龄: 27.6667  ((25+30+28)/3=27.6667)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值