[toc]
Linux文本操作
linux文本的操作命令
awk -按“字段”处理文本
- 把每一行切成多个字段(默认用空格或TAB分隔),然后对字段做过滤、计算、重组、统计等操作
- 能够按行读取文件,按字段分割数据,并根据条件进行筛选、计算、格式化输出等操作
语法
awk [选项] '模式 {动作}' 文件
-
模式:何时触发(条件)
-
动作:触发后做什么(打印、计算、赋值…)(花括号 {} 包含)
-
常用选项
选项 | 说明 | 示例 |
---|---|---|
-F fs |
指定字段分隔符(默认为空格或制表符) | awk -F: '{print $1}' /etc/passwd |
-v var=value |
定义变量并赋值(传递外部变量给 awk ) |
awk -v x=10 'x==10 {print "匹配"}' |
-f scriptfile |
从脚本文件中读取 awk 命令 |
awk -f script.awk file.txt |
BEGIN{} |
在处理文件前执行(初始化操作) | awk 'BEGIN {print "开始处理"} {print $1}' |
END{} |
在处理完所有行后执行(总结操作) | awk '{sum+=$1} END {print "总和:", sum}' |
- 内置变量
变量 | 说明 | 示例 |
---|---|---|
$0 |
当前行的整行内容 | awk '{print $0}' (等同于 cat ) |
$1, $2,... |
当前行的第1、第2个字段(从1开始) | awk '{print $1, $3}' (打印第1和第3列) |
NF |
当前行的字段总数 | awk '{print $NF}' (打印最后一列) |
NR |
当前行号(从1开始) | awk '{print NR, $0}' (打印行号和内容) |
FNR |
当前文件中的行号(处理多个文件时有效) | awk 'FNR==1 {print "文件新行开始"}' file1 file2 |
FS |
输入字段分隔符(默认为空格) | BEGIN {FS=":"} (等效于 -F: ) |
OFS |
输出字段分隔符(默认为空格) | OFS="," (输出字段用逗号分隔) |
RS |
输入记录分隔符(默认为换行符) | RS="\n\n" (按段落分割) |
ORS |
输出记录分隔符(默认为换行符) | ORS=" " (输出行用空格分隔) |
awk [-F fs] [-v var=value] [-f scriptfile] \
' BEGIN { 初始化 }
模式1 { 动作1 }
模式2 { 动作2 }
...
END { 汇总输出 }
' file1 file2 ...
典型示例
- 提取字段
# 提取 `/etc/passwd` 中的用户名(第1列)和用户ID(第3列)
$ awk -F: '{print $1, $3}' /etc/passwd
- 条件过滤
# 打印用户ID大于1000的行
$ awk -F: '$3 > 1000 {print $1}' /etc/passwd
- 计算总和
# 计算 `data.txt` 中第一列的总和
$ awk '{sum += $1} END {print "总和:", sum}' data.txt
- 格式化输出
# 格式化输出学生信息(假设 `students.txt` 内容为 "姓名 年龄 专业")
$ awk '{printf "Name: %-10s Age: %d\n", $1, $2}' students.txt
- 使用 BEGIN 和 END 块
# 统计文件总行数
$ awk 'BEGIN {count=0} {count++} END {print "总行数:", count}' file.txt
sed -对文件替换/删除/插入
- 对文本进行逐行处理,并将结果输出到标准输出
sed
不会直接修改源文件,除非使用-i
选项
语法
sed [选项] '命令' 文件名
- 常用选项:
选项 | 作用 |
---|---|
-i |
直接修改文件内容(原地编辑) |
-e |
指定编辑命令(可多个) |
-n |
取消默认输出,仅输出匹配的行 |
-r |
使用扩展正则表达式(更简洁) |
- sed脚本命令:
命令 | 功能 | 语法 | 示例 |
---|---|---|---|
s |
替换文本 | [address]s/pattern/replacement/flags |
sed 's/Linux/Unix/g' file |
d |
删除行 | [address]d |
sed '2d' file 删除第 2 行 |
i |
插入文本(前) | [address]i\text |
sed '2i\Hello' file 在第 2 行前插入 |
a |
追加文本(后) | [address]a\text |
sed '2a\World' file 在第 2 行后追加 |
c |
替换整行 | [address]c\new_text |
sed '3c\New line' file 替换第 3 行 |
p |
打印行 | [address]p |
sed -n '2p' file 打印第 2 行 |
r |
读取文件内容 | [address]r file |
sed '2r new.txt' file 第 2 行后插入新文件内容 |
w |
写入文件 | [address]w file |
sed '3w out.txt' file 将第 3 行写入文件 |
= |
打印行号 | = |
sed '=' file 打印每行的行号 |
q |
退出 sed | q |
sed '1q' file 处理完第一行后退出 |
经典示例
- 替换文本(核心功能)
# 将文件中的 "apple" 替换为 "orange"(只替换每行第一个匹配)
$ sed 's/apple/orange/' file.txt
# 全局替换(每行所有匹配)
$ sed 's/apple/orange/g' file.txt
# 替换第2行中的文本
$ sed '2s/apple/orange/' file.txt
# 替换第2-5行的文本
$ sed '2,5s/apple/orange/' file.txt
- 删除行
# 删除第3行
$ sed '3d' file.txt
# 删除第2-4行
$ sed '2,4d' file.txt
# 删除包含 "error" 的行
$ sed '/error/d' file.txt
# 删除空白行
$ sed '/^$/d' file.txt
- 插入/追加文本
# 在第2行前插入一行 "New Line"
$ sed '2i New Line' file.txt
# 在最后一行后追加 "End Line"
$ sed '$a End Line' file.txt
- 打印特定行
# 仅打印第5行(-n 抑制默认输出,p 打印匹配行)
$ sed -n '5p' file.txt
# 打印包含 "warning" 的行
$ sed -n '/warning/p' file.txt
# 打印第10-15行
$ sed -n '10,15p' file.txt
- THE END -
最后修改:2025年8月1日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://www.qian777.cn/53.html
共有 0 条评论