vi grep awk sed 等工具都支持正则表达式
基础正则表达式
通过grep选取字符串
gerp [-acinv] '搜索的字符串' filename
选项:
-a 在二进制文件中,以文本文件的方式搜索数据
-c 计算找到'搜索的字符串'的次数
-i 忽略大小写
-n 输出行号
-v 反向选择,即找出不含有该字符串的那一行
-E 支持扩展正则表达式
搜索特定字符串
grep -n 'the' regular_express.txt
搜索含有the的行,并显示行号
利用[]来搜索集合字符
grep -n 't[ae]st' regular_express.txt
可以搜索到含有test tast的行
grep -n '[^g]oo' regular_express.txt
搜索 'oo'当前面不是g
grep -n '[^a-z]oo' regular_express.txt
搜索 'oo' 前面不能是小写字母
可以通过这种方式表示字母和数字 [a-zA-Z0-9]
行首和行尾字符^$
grep -n '^the' regular_express.txt
在一行字符串里查找the 并且the仅能在行首
grep -n '^[a-z]' regular_express.txt
查找小写字母开头的行
^早在[]里表示反向,外面表示行首
grep -n '\.$' regular_express.txt
查找.结束的行 小数点是特殊字符所以要用转义符
grep -n '^$' regular_express.txt
查找空行
任意一个字符(.)与重复字符(*)
grep -n 'g..d' regular_express.txt
查找g??d字符串
grep -n 'ooo*' regular_express.txt
查找至少含有两个o的行
grep -n 'g.*g' regular_express.txt
查找g开头并且g结尾的字符串
限定连续重复字符范围{}
因为大括号在shell脚本里特殊意义,所以需要加上转义符
grep -n 'o\{2\}' regular_express.txt
查找有两个o相连的行
grep -n 'go\{2,5\}g' regular_express.txt
查找g开头g结尾,并且中间带有2-5个o的字符串
重要的特殊字符(characters)
RE字符 含义
^word 待搜索的字符串(word)在行首
word$ 待搜索的字符串(word)在行尾
. 代表一个任意字符,一定是一个字符
\ 转义符,去掉特殊符号的特殊含义
* 重复另个或多个的前一个重复字符
\{n,m\} 连续n到m个字符
\{n\} 连续n个前一个字符
\{n,\} 连续n个以上的前一个字符
[] 字符中的重复 特殊字符的符号
[]中仅代表一个待搜索的字符
[^] 搜索的字符不能是方括号中的字符
扩展正则表达式
egrep支持扩展正则表达式
RE字符 含义
+ 重复“一个或一个以上”的字符
? 0个或1个字符
| 用或(or)的方式找出数个字符串
() 找出用户组字符串
printf 格式化显示
关于格式方面的几个特殊样式:
\a 警告的声音输出
\b 退格键
\f 清除屏幕
\n 输出新的一行
\r enter的输入
\t 水平制表符tab
\v 垂直制表符tabl
\xNN NN为两位数字,可以转换数字(十六进制)成字符
在C语言中常见的变量格式
%ns n是数字,s代表string 即多少个字符
%ni n是数字,i是integer 即多少整数字符
%N.nf n和N都是数字,f是float 假设要10位,小数两位%10.2f
sed工具简介
选项:
-n 使用安静(silent)模式,在一般sed的用法中,所有来自stdin
的数据一般都会显示在屏幕上
-e 直接在命令行模式上进行sed的操作编辑
-f 直接将sed的操作写在一个文件内,-f filename则执行filename
内的sed操作
-r sed的操作支持的是扩展正则表达式的语法
操作说明:[n1[,n2]]function
n1,n2不一定存在,一般代表 选择进行操作的行数,例如 需要在10-20
行之间进行,则10,20[function]
function 有下面的这些操作
a 新增 后面可以接字符串,而这些字符串会在新的一行出现
c 替换 c的后面可以接字符串,这些字符可以替换n1,n2之间的行
d 删除 因为是删除所以d后面一般不跟任何内容
i 插入 i后面的字符串会在新的一行出现
p 打印 即打印某个选择的数据 通常和sed -n一起使用
s 搜索 不但可以搜索,而且可以替换,可以和正则表达式一起使用
例:
显示/etc/passwd的内容,并且需要打印行号,同时将2-5行删除
nl /etc/passwd | sed '2,5d'
在上面的第二行后,加上 drink tea? 字样
nl /etc/passwd | sed '2a drink tea\?'
在第二行的后面加入两行字 'aadfs' 'adsfadfs'
nl /etc/passwd | sed '2a aadfs \
> adsfadfs'
将第2-5行替换为 “NO 2-5 number”
nl /etc/passwd | sed '2,5c NO 2-5 number'
仅打印3-7行
nl /etc/passwd | sed -n '3,7p'(-n必须加上)
打印lo 仅留下IP地址
ifconfig lo | grep 'inet ' | sed 's/^.*地址://g' | sed 's/掩码:.*//g'
awk工具简介
awk '条件类型1{动作1} 条件类型2{动作2}...' filename
awk主要处理 每一行字段内的数据 默认的字段分隔是空格或tab
内置变量
变量名称 代表的含义
NF 每一行($0)拥有的字段的总数
NR 当前awk所处理的是第几行数据
FS 当前的分隔符,默认是空格键
awk的逻辑运算字符
运算单元 代表意义
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
例如:
要查看第三栏小于10以下的数据,并且仅列出账号与第三栏
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
文件数据比较与显示的相关功能
文件比较diff diff [-bBi] from-file to-file
用于比较两个文件之间的不同一般用在ascii文件的比较
参数:
from-file 一个文件名,作为原始比较文件的文件名
to-file 作为目的比较文件的文件名
选项:
-b 忽略一行的多个空白差异
-B 护绿空白行的不同
-i 忽略大小写的差异
4d3 左边第四行被删除
6c5 左边第6行被换成右边文件的第五行
cmp 比较两个文件,用位去比
-s 将所有不同点全部列出来,默认只列出一个
patch 将旧内容更新到新版
patch -pN < patch_file
选项:
-p 后面可以接 取消几层目录
文件打印准备:pr
具体查文档
sed和gawk工具的功能非常强大 更多关于sed和gawk的内容请等待shell编程部分的笔记