Linux常用文件操作命令
sed 流编辑器 Stream EDitor
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表
--follow-symlinks 直接修改文件时跟随软链接
-i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N 指定“l”命令的换行期望长度
--posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
--help 打印帮助并退出
--version 输出版本信息并退出
-a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
-s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
sed语法
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
# OPTION 命令参数 script脚本信息 input File 输入文件... 可以多个
查看
使用sed 查看-n
通常和 p
一起使用达到只展示对应行的效果
# 查看4-10 行内容
[root@mdj-node linuxcommadtest]# sed -n '4,10 p' sed2.txt
-i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N 指定“l”命令的换行期望长度
--posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
--help 打印帮助并退出
# 查看以--开头的内容
[root@mdj-node linuxcommadtest]# sed -n '/^.--/ p' sed2.txt
--follow-symlinks 直接修改文件时跟随软链接
--posix 关闭所有 GNU 扩展
--help 打印帮助并退出
--version 输出版本信息并退出
# 忽略大小写打印 含有 “a” 字符的行
[root@mdj-node linuxcommadtest]# sed -n '/a/I p' sed.txt
chen peng yu ai liang xinxin
java is java java jav ja j p
budeliAo
查找
通常查找功能也是通过-n
和p
实现 但是会和通配符结合使用查找更加准确
# 查找有 "ja" 的行
[root@mdj-node linuxcommadtest]# sed -n '\%ja% p' sed.txt
java is java java jav ja j p
# 删除 2-10 输出 如果有两个文件则行数逻辑会拼接到一块
[root@mdj-node linuxcommadtest]# sed '2,10 d' sed2.txt
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表
--version 输出版本信息并退出
-a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
-s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
查看-新增
查看并且新增通过i
命令实现
# 在第二行后面追加 it-tes
[root@mdj-node linuxcommadtest]# sed -e 2a\it-tes sed.txt
chen peng yu ai liang xinxin
java is java java jav ja j p
it-tes
budeliAo
<><><><><><><><><>
# 在第一行前面追加 sedsed
[root@mdj-node linuxcommadtest]# sed '1 i\sedsed' sed.txt
sedsed
chen peng yu ai liang xinxin
java is java java jav ja j p
budeliAo
<><><><><><><><><>
替换
替换分为整行替换和字符串替换
# 将第二行替换为 “python”
[root@mdj-node linuxcommadtest]# sed '2 c\python' sed.txt
chen peng yu ai liang xinxin
python
budeliAo
<><><><><><><><><>
字符串替换 字符串替换用 s命令
# 将1到4的 li -》 产
[root@mdj-node linuxcommadtest]# sed '1,4 s/li/产/' sed.txt
chen peng yu ai 产ang xinxin
java is java java jav ja j p
bude产Ao
<><><><><><><><><>
操作原文件 通过 -i
实现 i
会对文件进行修改
# 删除第一行
[root@mdj-node linuxcommadtest]# sed -i '1 d' sed.txt
You have mail in /var/spool/mail/root
[root@mdj-node linuxcommadtest]# cat sed.txt | head
java is java java jav ja j p
budeliAo
<><><><><><><><><>
# 修改之前备份源文件
[root@mdj-node linuxcommadtest]# sed -i.bak 's/a/A/' sed.txt
[root@mdj-node linuxcommadtest]# cat sed.txt.bak
java is java java jav ja j p
A/s
budeliAo
A/s
<><><><><><><><><>
A/s
[root@mdj-node linuxcommadtest]# cat sed.txt
jAva is java java jav ja j p
A/s
budeliAo
A/s
<><><><><><><><><>
A/s
# 加上 g 表示全局替换
[root@mdj-node linuxcommadtest]# sed -i.bak 's/a/A/g' sed.txt
You have mail in /var/spool/mail/root
[root@mdj-node linuxcommadtest]# cat sed.txt
jAvA is jAvA jAvA jAv jA j p
A/s
budeliAo
A/s
<><><><><><><><><>
A/s
awk
工作原理:逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
和sed
有所不同,sed
命令常用于一整行的处理,而awk
比较倾向于将一行分成多个“字段”然后再进行处理。awk
信息的读入也是逐行读取的,执行结果可以通过print
的功能将字段数据打印显示。在使用awk
命令的过程中,可以使用逻辑操作符&&
表示“与”、||
表示“或”、!
表示“非”;还可以进行简单的数学运算,如+
、-
、*
、/
、%
、^
分别表示加、减、乘、除、取余和乘方。
语法
awk ‘BEGIN {commands} pattern {commands}END{commands}' file1
BEGIN:处理数据前执行的命令
END:处理数据后执行的命令
pattern:模式,每一行都执行的命令 pattern里的命令会匹配每一行去处理
BEGIN和END里的命令只是执行一次
内建变量
# 这些内建变量可以直接在 script 中直接使用
FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第n个字段(第n列)。
FILENAME:被处理的文件名。
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
查看
查看用 {print}
# 查看文件内所有内容
[root@mdj-node linuxcommadtest]# awk {print} clearsky
[5]焦宇
[6]陈红卫
[7]高妮娜
[8]87-89.
[9]2021.23-30.
[10](10):61-65.
[11]2023,32(03):60-63.
[12]王旭光
[13]JoKharchenko K ,Beznosyk
[14]基于信息技术的超市后台管理系统研究
# 查看 1~3 行内容
[root@mdj-node linuxcommadtest]# awk 'NR==1,NR==3{print}' clearsky
[5]焦宇
[6]陈红卫
[7]高妮娜
# 查看 1 || 3 内容
[root@mdj-node linuxcommadtest]# awk 'NR==1||NR==3{print}' clearsky
[5]焦宇
[7]高妮娜
# 查看 k 结尾的内容
[root@mdj-node linuxcommadtest]# awk '/k$/{print}' clearsky
[13]JoKharchenko K ,Beznosyk
计算
# 统计出现 2 字符的行数
[root@mdj-node linuxcommadtest]# awk 'BEGIN{x=0};/2/{x++};END{print x}' clearsky
3
# 输出所有偶数行内容
[root@mdj-node linuxcommadtest]# awk 'NR%2==0{print}' clearsky
[6]陈红卫
[8]87-89.
[10](10):61-65.
[12]王旭光
[14]基于信息技术的超市后台管理系统研究
# 输出每个列中的第二个字符串 默认用空格分隔
[root@mdj-node linuxcommadtest]# awk '{print $2}' clearsky
K
# 输出记录和行号 -F ":" 的意思是以 : 为分隔
[root@mdj-node linuxcommadtest]# awk -F ":" '{print NR,$0}' clearsky
1 [5]焦宇
2 [6]陈红卫
3 [7]高妮娜
4 [8]87-89.
5 [9]2021.23-30.
6 [10](10):61-65.
7 [11]2023,32(03):60-63.
8 [12]王旭光
9 [13]JoKharchenko K ,Beznosyk
10 [14]基于信息技术的超市后台管理系统研究
# 输出以 : 分隔的里面第二个字段包含61-65的行
[root@mdj-node linuxcommadtest]# awk -F ":" '$2~"61-65"{print}' clearsky
[10](10):61-65.
结合管道
# 通过 wc -l 命令获取文件行数
[root@mdj-node linuxcommadtest]# awk '{print | "wc -l"}' clearsky
10
# 查看cpu 空闲率
[root@mdj-node linuxcommadtest]# top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1}'
45.2
# 显示系统上次重启时间
[root@mdj-node linuxcommadtest]# date -d "$(awk -F "." '{print $1}' /proc/uptime) second ago" +"%F %H:%M:%S"
2024-03-17 15:38:56
管道
管道命令是一个 |
当在两个命令之间设置管道时,管道符|
左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的 Linux 命令都可以用来形成管道。
并且只有前面命令的输出可以作为后面命令的输入的时候才能处理
示例
# 查看是否有sed.txt 字符存在则输出行 所以不仅仅是文件名,也可以是文件前缀 或者 其他字眼 通常文件名
[root@mdj-node linuxcommadtest]# ls -al | grep sed.txt
-rw-r--r-- 1 root root 69 May 30 10:50 sed.txt
-rw-r--r-- 1 root root 69 May 30 10:48 sed.txt.bak
# 将目录列表输入到文件中
[root@mdj-node linuxcommadtest]# ls -al | cat > log.txt
You have mail in /var/spool/mail/root
[root@mdj-node linuxcommadtest]# ls
abc.txt clearsky Docker.md log.txt sed2.txt sed.txt sed.txt.bak
[root@mdj-node linuxcommadtest]# cat log.txt
total 36
drwxr-xr-x 2 root root 4096 May 30 13:26 .
dr-xr-x---. 7 root root 4096 May 30 11:23 ..
-rw-r--r-- 1 root root 71 May 29 18:30 abc.txt
-rw-r--r-- 1 root root 199 May 30 11:23 clearsky
-rw-r--r-- 1 root root 6726 May 29 17:32 Docker.md
-rw-r--r-- 1 root root 0 May 30 13:27 log.txt
-rw-r--r-- 1 root root 1335 May 30 09:21 sed2.txt
-rw-r--r-- 1 root root 69 May 30 10:50 sed.txt
-rw-r--r-- 1 root root 69 May 30 10:48 sed.txt.bak
# 统计登录人数
[root@mdj-node linuxcommadtest]# who | wc -l
2
ps
ps
用于查看系统进程,进程什么时候开始运行的,哪个用户运行的,占用了多少资源。
语法
ps [options]
# options为可选参数 参数可以组合起来
进程命令参数
参数可组合使用 常见组合有
-ef
查看所有进程-aux
详细显示所有进程- 还可以结合管道查看指定进程
-e # 显示所有进程
-f # 显示所有字段(UID,PPIP,C,STIME字段)
-h # 不显示标题
-l # 长格式
-w # 宽输出
-a # 显示一个终端的所有进程
-r # 只显示正在运行的进程。
-u # 显示当前用户进程和内存使用情况
-x # 显示没有控制终端的进程
–sort # 按照列名排序
展示字段含义
UID # 用户ID,即进程的拥有者
PID # 进程ID
PPID # 该进程的父级进程id,如果一个程序的父级进程找不到,该程序的进程被称为僵尸进程
C # cpu的占用率,形式是百分数(%)
STIME # 进程开始启动时间
TTY # 终端设备,发起该进程的设备识别符号,如果显示‘ ?’表示该进程并不是由终端发起
TIME # 进程的执行时间
CMD # 该进程的名称或对应的路径
# 实例
[root@mdj-node ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Mar17 ? 00:11:28 /usr/lib/systemd/systemd --system --deserialize 20
root 2 0 0 Mar17 ? 00:00:00 [kthreadd]
root 4 2 0 Mar17 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Mar17 ? 00:00:53 [ksoftirqd/0]
less
less
是一个文本查看命令,可以查看任意大小的文件。支持滚动翻页搜索和标记
语法
less [options] file
命令参数
常用命令参数
-b # 设置缓冲区大小 加快文件加载速度
-e # 在莫问加一个end标记 可以通过 q 键退出查看
-F # 如果文件不超过页面大小直接显示,否则采用less的交互窗口
-h # 显示命令帮助信息
-n # 显示行号
-V # 将连续的空白行压缩
示例
# 查看文件
less fileName
# 输入 / 或者 ? 可进行查找 / 从头开始 ? 从末尾开始
# 显示行号查看
less -n file
# m 可以标记某一行