前言
前提是要掌握以下内容,才能很好的学习本片博文,此篇博文做深入学习和以往知识复习之用。以下这些知识点可以查看博主的 linux 栏目的内容,都有作很详细的针对性的介绍使用
- 正则表示的运用
- linux 三剑客的基本熟悉了解
- linux 一些命令的使用熟悉了解
一些小问题
# shell 单引号还是双引号问题
shell 中单引号中的是原始字符串,不能起到转义变量的作用
双引号中的可以是变量,从而表示新字符串,也就是说双引号中可以识别变量,但是单引号中不能识别变量
# 打开 linux 文档后如何查看
pageUp 向上翻页
pageDown 向下翻页
输入/后面输入要搜索的内容,n 表示 next,N 表示上一个
# awk 为什么单引号中加双引号
awk 单引号中表示其中为 awk 的脚本,加上双引号表示打印字符串,类似 java 的字符串用双引号输出
# 注意了 grep 中的正则可以在单引号中直接编写,sed 和 awk 中的正则则需要在 / / 中编写,这是因为单引号外是它们自己的脚本动作,因为 sed 是一种编辑器(面向流),awk 是一个解释器,其本身即使一门编程语言,它们为了将正则和自己专有的脚本作区分,所以让正则用 / / 包裹
grep
擅长行的处理
grep 后是正则脚本
格式
grep [OPTION] PATTERN [FILE]
OPTION 选项
# 显示不被模式匹配到的行
-v
# 忽略大小写
-i
# 显示行号
-n
# 统计匹配的行数
-c
# 仅显示匹配到的字符串
-o
# 支持扩展正则
-E
# 查找后几行
-B n
# 查找前几行
-A n
# 查找前后几行
-C n
sed
擅长替换,一次处理一行
sed 只会修改临时存储在模式空间的内容,真实原内容不会变,除非加命令让真实内容改变
sed 后是 sed 的脚本 + 正则组合使用
格式
-e
是指定后面脚本
sed [-hnV] [-e<script>] [-f<script文件>] [文本文件]
注意点
# 默认只支持 ^$.*[] 基础正则
grep
# 这种写法可以支持扩展正则
egrep
grep -E
例子
# 加 -e 有什么好处呢?如果你写两段单引号的正则,加了 -e 的都可以正常执行,没加的只能执行第一个
sed -e '10a tmp' -e '11a tmp2'
sed '10a tmp' '11a tmp2'
# 行后新增,在第十行后新增一行 tmp,a 表示 add,-e 可以不加默认就是脚本
sed -e '10a tmp'
sed '10a tmp'
# 行更改,用 tmp 取代 1-10 行内容,写作 1,10c,c 有 change 的意思
sed '1,10c tmp'
sed -e '1,10c tmp'
# 行删除,删除 1-10 行内容,d 有 delete 的意思
sed '1,10d'
sed -e '1,10d'
# 行前插入,在第十行前插入一行 tmp,i 表示 insert 的意思
sed '10i tmp'
sed -e '10i tmp'
# 正常打印到屏幕,加 -e 无法输出到屏幕,只能加 -n 才能
sed -n '/regex/p'
# 全局替换文本,s 表示 select 选择,g 表示 global 全局,不加 g 表示替换第一个
sed 's/tmp1/tmp2/g'
sed -e 's/tmp1/tmp2/g'
# 表示直接修改原文件了,这个一定要注意使用!!!
-i
注意点
# 默认支持基础正则
sed
# 支持扩展正则
sed -r
# 同时我们也建议使用 s#...#...#g 这种写法因为这种写法可以避免将里头的“/”字符转义,显得看起来混乱
sed -r s#...#...#g
# 另外需要特别注意的是使用 -r 时是支持扩展正则,但是仅仅是在第一个井号和第二个井号之间支持,第二个和第三个井号之间是不支持正则的,会以纯文本形式输出
sed -r s#识别一切正则符号#不识别一切正则符号#g
awk
擅长列的切片,空格为默认分隔符。awk 本身其实就是一门编程语言
awk 的大致流程就是逐行处理,把行作为赋值给 $0
,然后将 $0
按照默认空格符做切分,切分为 $1, $2, $3...
,然后执行编程动作,最后输出到屏幕
awk 后相当于是正则 + 编程脚本的混合使用
格式
awk 'pattern + action' [FILE]
例子
# BEGIN 处理文本前要执行的
# 先让文件以 begin 开头做第一行,然后打印第一列
awk 'BEGIN{print "begin"} {print $1}' file.log
# END 处理文本后要执行的
# FS 设置分隔符,默认是空格,等价于 -F
# NF 列数
# NR 行数
# 以 : 为分隔符,导引第二行一整行的信息
awk -F : 'NR==2 {print $0}' file.log
# OFS 输出域分隔符,ORS 输出记录分隔符,RS 控制记录分隔符(默认\n)
# $0 整行,$1 第一列 ...
# 以 : 为分隔符,匹配 root 的行,并显示第一列,第二列
awk -F : '/root/ {print $1,$2}' file.log
# 因为 awk 本身是一门编程语言,{print...} 前相当于是条件语句,其中条件表达式需要用 && 连接
awk '/aaa/ && NR==1 && NF==1 {print $0}' file.log
# 直接依据条件来输出也行
awk 'NR==1' file.log
注意点
# awk 中 NR 和 NF 表示数字,即共多少行和多少列