在日常使用Linux系统时,经常需要对文本或文件名进行各种操作。比如从一段日志里提取特定信息,或者批量重命名文件。这时候掌握一些shell命令的字符串处理技巧,能省下不少时间。
截取字符串内容
假设你有一堆图片文件,名字都是 IMG_20240501_123456.jpg 这种格式,现在只想保留日期部分做重命名。可以用bash内置的变量扩展功能:
filename="IMG_20240501_123456.jpg"
date_part=${filename:4:8} # 从第4位开始取8个字符
echo $date_part # 输出 20240501
这种写法比调用外部命令更快,特别适合脚本中循环处理大量文件。
替换文本中的部分内容
有时候下载的视频文件名带有网站前缀,比如 B站精选_如何学习shell编程.mp4,想把前面的“B站精选_”去掉。可以直接用参数展开实现:
video="B站精选_如何学习shell编程.mp4"
clean_name=${video#*_} # 去掉最短匹配的*_之前的内容
echo $clean_name # 输出 如何学习shell编程.mp4
如果要替换中间某段文字,比如把所有空格换成下划线,可以这样写:
bad_name="my vacation photo 2024.jpg"
good_name=${bad_name// /_}
echo $good_name # 输出 my_vacation_photo_2024.jpg
用awk提取字段
查看服务器日志时,经常遇到这样的行:192.168.1.100 - - [05/May/2024:10:23:45] "GET /index.html HTTP/1.1" 200。如果只想看访问的页面路径,可以用awk按引号分割:
echo '192.168.1.100 - - [05/May/2024:10:23:45] "GET /index.html HTTP/1.1" 200' | awk -F'"' '{print $2}' | awk '{print $2}'
第一个awk按双引号切分,取出第二个字段(即请求行),第二个awk再按空格拆开拿到URL路径。
结合grep和sed清洗数据
从网页抓下来的文本常常夹杂着多余标签。比如有一段内容是 <title>实用shell技巧</title>,要去掉HTML标签只留文字:
html_line="<title>实用shell技巧</title>"
text_only=$(echo $html_line | sed 's/<[^>]*>//g')
echo $text_only # 输出 实用shell技巧
这条sed命令会删除所有以<开头、>结尾的标记,适用于清理简单的HTML片段。
判断字符串是否包含子串
写自动化脚本时,常需要根据输出内容做判断。例如检测某个服务是否运行正常,返回信息里是否含有“running”:
status_output="Service nginx is currently running"
if [[ $status_output == *running* ]]; then
echo "服务正在运行"
fi
这里的星号是通配符,表示任意字符,相当于模糊匹配。
这些小技巧看似简单,但在处理日志分析、文件整理、自动化部署等任务时非常实用。不需要安装额外工具,直接用系统自带的shell功能就能快速解决问题。