Linux三剑客(grep sed awk)学习-进阶篇

前言

前提是要掌握以下内容,才能很好的学习本片博文,此篇博文做深入学习和以往知识复习之用。以下这些知识点可以查看博主的 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 表示数字,即共多少行和多少列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章