哈喽,我是阿曼,众多优质应用、效率工具、宝藏网站、办公干货尽在曼慢分享。
Linux日常操作中,字段截取命令使用频繁,日志分析、文件名处理等场景均会用到。本文汇总9个常用字段截取命令,新手看完也能快速上手。
先统一用两个测试内容,所有示例都基于这两个,方便大家对照练习、直接复用:
# 测试字符串(模拟日志/文本内容)str="name:alice age:20 city:beijing"# 测试文件名(模拟日常办公文件)file="document.pdf"
一、Shell内置截取(轻量高效,新手首选)
1. # :左删最短匹配(快速提取后缀)
核心用途:快速去掉字符串左边的前缀内容,保留从第一个匹配字符开始的后续内容,常用于提取文件后缀。
# 删掉左边到第一个“:”为止的内容,保留后续echo ${str#*:} # 输出:alice age:20 city:beijing# 提取文件名后缀(日常最常用场景)echo ${file#*.} # 输出:pdf
2. ## :左删最长匹配(提取末尾字段)
核心用途:删除左边所有内容,只保留最后一个匹配字符后面的内容,适合提取最末尾的字段。
# 删掉左边所有内容,直到最后一个“:”,只留末尾字段echo ${str##*:} # 输出:beijing# 无论文件名有多少个“.”,都能提取最终后缀echo ${file##*.} # 输出:pdf
3. % :右删最短匹配(提取文件名主体)
核心用途:去掉字符串右边的后缀内容,保留到第一个匹配字符为止的前面内容,常用于提取文件名主体。
# 删掉右边第一个空格及后面所有内容echo ${str% *} # 输出:name:alice age:20# 去掉文件名后缀,保留文件名本身echo ${file%.*} # 输出:document
4. %% :右删最长匹配(提取开头字段)
核心用途:删除右边所有内容,只保留第一个匹配字符前面的内容,适合提取最开头的字段。
# 删掉右边所有空格及后面内容,只留第一段echo ${str%% *} # 输出:name:alice# 彻底去掉所有后缀,确保只保留文件名主体echo ${file%%.*} # 输出:document
5. ${变量:起始位置:长度} :指定位置/负数字符串截取
核心用途:直接指定起始位置和截取长度,支持负数字符串(从字符串末尾开始计数),精准截取任意片段,日常操作中也很常用。
# 正数起始:从第1个字符开始(索引从0开始),截取5个字符echo ${str:0:5} # 输出:name:# 正数起始:从第6个字符开始,截取5个字符echo ${str:5:5} # 输出:alice# 负数字符串:从末尾开始,截取7个字符(-7表示从倒数第7个字符开始)echo ${str: -7} # 输出:beijing(注意冒号后有空格)# 负数字符串+长度:从末尾第10个字符开始,截取5个字符echo ${str: -10:5} # 输出:city:# 文件名截取:从末尾第4个字符开始,截取4个字符(匹配后缀)echo ${file: -4} # 输出:.pdf
二、常用命令截取(复杂场景,精准应对)
6. cut :按列/字符精准截取(日志/CSV首选)
核心用途:专门处理按分隔符拆分的字段(比如日志、CSV文件),可以按列、按字符位置截取,精准又高效。
注:cut命令索引从1开始
# 按“:”分割文本,取第2列echo $str | cut -d ':' -f 2 # 输出:alice age# 按“:”分割,取第2、3列(连续列)echo $str | cut -d ':' -f 2-3# 按字符位置截取,取第1-5个字符echo $str | cut -c 1-5 # 输出:name:
7. tr :字符替换/删除(辅助截取,清理文本)
核心用途:本身不直接截取,但能快速替换、删除无用字符,配合其他命令使用,让截取更高效(比如清理日志里的特殊符号)。
# 把“:”替换成空格,方便后续按空格截取echo $str | tr ':' ' '# 删除所有“:”,快速清理文本echo $str | tr -d ':'
8. awk :万能字段截取(多列复杂文本神器)
核心用途:处理多列文本的神器,默认按空格/制表符分割,支持复杂逻辑,适合日志分析、多字段提取等场景。
# 按默认空格分割,取第1列echo $str | awk '{print $1}' # 输出:name:alice# 按默认空格分割,取第2列echo $str | awk '{print $2}' # 输出:age:20# 自定义按“:”分割,取第2列echo $str | awk -F ':' '{print $2}' # 输出:alice age
9. sed :正则截取(特殊规则,灵活适配)
核心用途:支持正则表达式,能截取符合特定规则的内容(比如提取数字、特定关键词后面的内容),解决复杂截取需求。
# 提取“age:”后面的数字(比如日志里的年龄、ID)echo $str | sed 's/.*age:\([0-9]*\).*/\1/' # 输出:20# 删除“ age”及后面所有内容,只保留前面的姓名信息echo $str | sed 's/ age.*//' # 输出:name:alice
命令选择指南
不用死记硬背,根据操作场景快速选择,效率翻倍:
✅ 简单字符串、文件名处理:用 #、##、%、%%、${变量:起始位置:长度}(内置最快,不用敲多余命令)
✅ 按分隔符取列(日志、CSV):用 cut(简单直接,新手首选)
✅ 多列复杂文本、批量处理:用 awk(万能工具,高频使用)
✅ 正则匹配、特殊内容提取:用 sed(灵活强大,解决疑难需求)
✅ 清理文本、替换字符:用 tr(配合其他命令,提升效率)
建议收藏本文,遇到相关需求时直接对照示例复制使用,慢慢熟练后,你会发现Linux操作原来这么高效!如果觉得有用,记得转发给身边需要的同事,一起告别无效操作~
听说点“在看”福旺财更旺!