在Linux系统中,处理文本文件时,经常需要提取其中的部分内容,比如查看日志文件的关键信息、提取配置文件的特定字段、筛选数据行等,Linux提供了丰富的命令行工具,通过灵活组合这些工具,可以高效实现部分内容的打印,本文将详细介绍常用命令的用法及场景,帮助读者掌握Linux下打印部分内容的核心技巧。

按行位置提取:head与tail
当需要提取文件开头或结尾的若干行时,head和tail是最直接的选择。
-
head:用于打印文件开头部分内容。
常用选项:-n:指定行数,默认为10行,-n 5表示打印前5行,也可简写为-5。-c:按字节数提取,-c 20打印前20个字节。-q:多文件时不显示文件名头。
示例:head -n 3 file.txt打印文件前3行;head -c 10 file.txt打印文件前10个字符。
-
tail:用于打印文件结尾部分内容,常用于实时监控日志更新。
常用选项:-n:指定行数,-n 5打印最后5行,-n +3从第3行开始打印到文件末尾。-f:实时追踪文件新增内容(类似“实时监控”),常用于日志分析,如tail -f system.log。-c:按字节数提取,-c 10打印最后10个字节。
示例:tail -n 2 file.txt打印文件最后2行;tail -f /var/log/nginx/access.log实时查看Nginx访问日志。
按模式匹配提取:grep
grep基于文本模式(正则表达式)匹配并打印符合条件的行,是文本筛选的核心工具。
常用选项:
-i:忽略大小写匹配,如grep -i "ERROR" log.txt匹配包含”ERROR”或”error”的行。-n:显示匹配行的行号,方便定位,如grep -n "192.168.1.1" access.log。-v:反向匹配,打印不符合条件的行,如grep -v "^#" config.conf(排除注释行)。-c:仅输出匹配行数,如grep -c "success" result.txt统计成功次数。-E:支持扩展正则表达式,如grep -E "error|warning" log.txt匹配包含”error”或”warning”的行。-A/-B:显示匹配行后的行(after)或前的行(before),如grep -A 2 "Failed" auth.log打印”Failed”行及其后2行。
示例:grep -n "root" /etc/passwd打印包含”root”的行及行号;grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"过滤掉Nginx配置文件的注释和空行。
按列提取:cut
cut用于按列或分隔符提取文本内容,适合处理结构化数据(如CSV、配置文件)。

常用选项:
-d:指定分隔符,默认为制表符(t),如-d ":"表示以冒号为分隔符(如/etc/passwd)。-f:指定提取的字段列,-f 1提取第1列,-f 1,3提取第1和第3列,-f 1-3提取第1到3列。--complement:提取指定列之外的列,如cut -d: -f1 --complement /etc/passwd提取除第1列外的所有字段。-c:按字符位置提取,-c 1-5提取每行的第1到5个字符。
示例:cut -d: -f1,3 /etc/passwd提取用户名和UID;cut -d, -f2,4 data.csv提取CSV文件的第2和第4列。
流编辑提取:sed
sed(Stream Editor)是一个强大的流编辑器,通过“编辑动作”实现文本提取,支持按行号、模式匹配定位内容。
常用选项:
-n:静默模式,仅打印匹配的行(默认会打印所有行)。p:打印指定行,如sed -n '3p' file.txt打印第3行;sed -n '3,5p' file.txt打印3到5行。/pattern/p:匹配模式后打印,如sed -n '/error/p' log.txt打印包含”error”的行。d:删除指定行(不打印),如sed '3d' file.txt删除第3行并打印剩余内容(常与-n结合仅看删除后的结果)。a/i/c:在行后(after)/行前(before)/替换(change)插入文本,如sed '3a newline' file.txt在第3行后插入”newline”。
示例:sed -n '1p;5p' file.txt打印第1行和第5行(分号分隔多个命令);sed -n '/^#/d;p' config.conf删除注释行后打印剩余内容。
复杂字段处理:awk
awk是文本处理的“瑞士军刀”,支持按字段分割、条件判断、循环计算等,适合复杂场景的提取。
基本语法:awk '条件 {操作}' 文件,默认以空格/制表符分隔字段($1、$2…表示第1、2列,$0表示整行,NF字段数,NR行号)。

常用功能:
- 提取指定列:
awk '{print $1, $3}' file.txt打印每行的第1和第3列。 - 条件筛选:
awk '$2 > 100 {print $1, $2}' data.txt打印第2列大于100的行的第1、2列。 - 模式匹配:
awk '/^root/ {print}' /etc/passwd打印以”root”开头的行(等同于grep ^root)。 - 自定义分隔符:
awk -F: '{print $1, $7}' /etc/passwd(-F指定分隔符,效果同cut -d:)。 - 内置变量:
awk 'NR >= 3 && NR <= 5 {print NR, $0}' file.txt打印行号3到5的行及行号。
示例:awk -F, '{if ($3 > 90) print $1, $3}' score.csv提取成绩大于90的学生姓名和分数;awk 'BEGIN {sum=0} {sum+=$2} END {print sum}' data.txt计算第2列的总和并打印(BEGIN预处理,END收尾)。
组合使用:管道与重定向
实际场景中,常通过管道()将多个命令组合,实现复杂提取。
grep "error" log.txt | cut -d' ' -f1,4:先筛选包含”error”的行,再提取第1和第4列。tail -n 100 system.log | awk '{print $1, $6}':查看最后100行日志,提取IP地址和请求路径(假设第1列是IP,第6列是路径)。cat file.txt | sed -n '2,4p' | sort:打印文件2到4行并排序(cat读取文件后通过管道传给sed和sort)。
常用命令速查表
| 命令 | 功能描述 | 常用选项 | 示例说明 |
|---|---|---|---|
| head | 打印文件开头部分 | -n(行数)、-c(字节数) |
head -5 file.txt(前5行) |
| tail | 打印文件结尾部分 | -n(行数)、-f(实时追踪) |
tail -f log.txt(实时监控日志) |
| grep | 模式匹配打印行 | -n(行号)、-v(反向)、-A/-B |
grep -n "error" log.txt |
| cut | 按列/分隔符提取 | -d(分隔符)、-f(字段) |
cut -d: -f1 /etc/passwd(用户名) |
| sed | 流编辑提取行 | -n(静默)、p(打印) |
sed -n '3,5p' file.txt(3-5行) |
| awk | 复杂字段处理与计算 | -F(分隔符)、$1/$2(字段) |
awk '{print $1}' file.txt(第1列) |
相关问答FAQs
Q1: 如何同时打印文件的前10行和后10行?
A: 可以通过head和tail组合实现:head -n 10 file.txt && tail -n 10 file.txt。&&表示前一条命令执行成功后执行后一条,这里会先打印前10行,再打印后10行,若需合并输出(不重复中间行),可用cat -n file.txt | awk 'NR <= 10 || NR >= (NR-10)'(需结合总行数计算,更简单的方式是cat -n file.txt | tail -n +$(($(wc -l < file.txt)-9)) | head -n 20,即从倒数第10行开始取20行)。
Q2: 如何打印包含特定关键词(如”login”)且第3列大于50的行?
A: 可以结合grep和awk:grep "login" file.txt | awk '$3 > 50 {print}',先通过grep筛选包含”login”的行,再通过awk判断第3列是否大于50,符合条件的行会被打印,若需精确匹配(避免部分匹配),可加-w选项:grep -w "login" file.txt | awk '$3 > 50 {print}'。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/22228.html