3. linux常用命令及三剑客 grep sed awk 用法
Posted mamingchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. linux常用命令及三剑客 grep sed awk 用法相关的知识,希望对你有一定的参考价值。
linux 常用命令:文件、网络、性能
一.常用命令
文件
ls
cd
pwd
mkdir
cp
rm
mv
- 文件属性
# 授权
r: 读权限 4;
w: 写权限 2;
x: 操作权限 ;
r+w+x=7,是最高权限
chomd 777 文件名
网络
ping # 测试网络连接情况
ping -c 5 www.baidu.com # ping 5次百度
ping -l 2 www.baidu.com # 每间隔2秒ping一次?
netstat # 打印linux网络系统的状态信息
-t # 列出所有tcp
-u # 列出所有udp
-l # 只显示监听端口
-n # 以数字形式显示地址和端口号
-p # 显示进程的pid和名字
netstat -ntlp
性能
top #持续监视系统性能
ps #查看进程信息
ps -aux # 显示所有进程,包括用户,分组情况
top是实时监控,ps是快照,不能实时监控
二. linux三剑客与管道使用
管道、三剑客(grep,sed,awk)是linux命令,正则不是linux命令
正则
正则训练网址: https://tool.oschina.net/regex/
实战演练
- 找出所有的 hi 单词
\\bhi\\b
- 匹配固定电话号码
0\\d{2}-\\d{8}
- 匹配以字母a开头的单词
\\ba\\w*\\b
- 匹配刚好6个字符的单词
\\b\\w{6}\\b
- 匹配1个或更多连续的数字
\\d+
- 5位到12位qq号
\\d{5,12}
备注: 单词必须以 前后\\b来包裹,并且是空格隔开的
三剑客
1. 管道
定义: 根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
语法: grep [OPTIONS] PATTERN [FILE]
意思:OPTIONS是参数 PATTERN可以理解为正则,FILE表示对那个文件或文本进行匹配
grep OPTIONS参数:
-v #显示不被pattern匹配到的行
-i #忽略字符大小写
-n #显示匹配的行号
-c #统计匹配的行数
-o #仅显示匹配到的字符串
-E #使用ERE,相当于egrep
- grep 实战
test.txt
hello world root
i am mamingchen
i am ROOT
swap abc
i am root
- 查找文件内容包含root的行数
grep -ni root test.txt
- 查找文件内容不包含root的行数
grep -nv root test.txt
- 查找以s开头的行
# 正则加不加引号都行
grep -n \'^s\' test.txt
grep -n ^s test.txt
- 查找以n结尾的行
# 正则加不加引号都行
grep -n \'n$\' test.txt
grep -n n$ test.txt
2.sed
定义:sed是流编辑器,一次处理一行内容
问题:grep其实也是一次处理一行,那sed与grep有什么区别呢?
sed是每次读取文件的一行 -> 临时存储在模式空间->然后sed命令处理->处理完成后送入屏幕->最后清空模式空间;
sed按照上面的流程每次读取一行处理一行,知道全部行都处理完
命令解析:
# 1. 常用参数
sed [-hn..][-e<script>][-f<script文件>][输入的文本文件]
-h #显示帮助
-n #仅显示script处理后的结果
-e<script> # 以选项中指定的script来处理输入的文本文件,-e参数可以省略
-f<script> # 以选项中指定的script文件来处理输入的文本文件
-i<script> # 直接修改源文件
# 2. sed常见动作
1. a # 新增
sed -e \'4 a newline\' test.txt # \'4 a newline\'就是-e指定的脚本内容,意思是:在test.txt文件的第4行的`后面`新增一条文本,文本内容是newline
2. c # 取代
sed -e \'2,5c No 2-5 number\' test.txt # \'2,5c No 2-5 number\'就是-e指定的脚本内容,意思是:用c后面的内容 `No 2-5 number` 去取代test.txt的第2行到第5行的内容
3. d # 删除
sed -e \'2,5d\' test.txt # 意思是要删除test.txt文件的第2到5行
4. i # 插入
sed -e \'2i newline\' test.txt #意思是在test.txt文件的第2行`前面`插入一条记录,记录的文本内容是newline
5. p # 打印
sed -n \'/root/p\' # 意思是匹配到 两个斜杠/中间的内容root后,打印
6. s # 取代
sed -e \'s/old/new/g\' test.txt # g是全局的意思。用后面的内容取代前面的内容,意思是在全局用 new去取代匹配到的old,
问题: sed 命令中的a 和 i什么区别?
a是在指定行的后面新增内容; i是在指定行的前面插入内容
# 查看帮助
man sed
sed -h
# 翻页:j向下,k向上
- sed 实战
- 在test.txt文件的第4行加上 \'i love taoche\'
# 注意,-e参数可以省略;这个添加是指输出到屏幕上,并没有真正的改变输入的文本文件test.txt
sed \'4 a i love taoche\' test.txt
- 在test.txt文件的第2行前添加\'i love taoche\'
sed \'2 i i love taoche\' test.txt
- 全局替换:用i love taoche替换test.txt文件中所有的root
# s后面不能有空格
sed \'s/root/i love taoche/g\' test.txt
- 直接修改文件内容:用i love taoche 直接修改源文件test.txt
sed -i \'s/root/i love taoche/g\' test.txt
- 直接修改源文件内容:在第4行后面新增 一个好汉三个帮
sed -i \'4a 一个好汉三个帮\' test.txt
3.awk
定义: 把文件按行逐行读入,以空格为默认分隔符将每行切片,切开的部分在进行后续处理
工作流程:
命令形式:
# pattern表示正则表达式,
# action表示对匹配到的内容执行命令(默认为输出每行内容)
# FILENAME表示要处理的输入的文本
# 意思:对FILE进行awk切片,然后再根据脚本\'pattern + action\'处理并打印到屏幕上
awk \'pattern + action\' [FILENAME]
常用参数:
FILENAME # awk流量的文件名
BEGIN # 处理文本之前要执行的操作
END # 处理文本之后要执行的操作
FS # 设置输入域分隔符,等价于命令行 -F 选项, 默认分隔符就是空格,可以通过这个参数指定其他分隔符
NF # 浏览记录的域的个数 (列数)
NR # 已读的记录数 (行数)
OFS # 输出域分隔符
ORS # 输出记录分隔符
RS # 控制记录分隔符
$0 # 整条记录
$1 # 表示当前行的第一个域 $2表示当前行的第二个域.....以此类推
- awd 实战
- 搜索/etc/passwd有root关键字的所有行,并显示对应的shell
# -F : 意思是把/etc/passwd文件按照:分割
# \'/root/ {print $7}\': 意思是正则匹配root,打印第7列
# 其中//中间的内容表示正则表达式, {}里面的内容表示执行的动作
awk -F : \'/root/ {print $7}\' /etc/passwd
- 打印/etc/passwd的第二行信息
# NR==2 就表示正在读第二行
# 读到第二行的时候,按照:分割,然后打印出整条内容
awk -F: \'NR==2{print $0}\' /etc/passwd
# 读到第二行的时候,不用分割,直接打印出整条内容
awk \'NR==2 {print $0}\' /etc/passwd
- 使用BEGIN加入标题,并输出第一列和第二列
# \'BEGIN {print "第一列,第二列"} {print $1,$2}\' 是一个脚本,意思是:在开始执行之前,先做第一个动作{print "第一列,第二列"},在屏幕上打印出第一列,第二列两个标题文字,然后再根据:分割后,执行第二个动作{print $1,$2},在屏幕上打印出分割后的第一列和第二列
awk -F : \'BEGIN {print "第一列 第二列"} {print $1,$2}\' /etc/passwd
- 默认的控制记录分隔符是回车, 自定义控制记录分隔符为 |
# echo "111|222|333 444|555 666":表示输出内容
# | awk : 表示把echo "111|222|333 444|555 666" 通过 管道符 给 awk 去处理
# awk \'BEGIN {RS="|"} {print $0}\': 表示awk拿到待处理文件后,首先指定控制记录分隔符RS为竖线,等awk处理完成后,打印出第一列内容
echo "111|222|333 444|555 666" | awk \'BEGIN {RS="|"} {print $0}\'
以上是关于3. linux常用命令及三剑客 grep sed awk 用法的主要内容,如果未能解决你的问题,请参考以下文章