1.grep
grep 支持基本正则表达式
egrep 基础和扩展的正则表达式都支持
egrep = grep -E
grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
1.1grep 格式
grep 匹配条件 处理文件
grep 匹配条件 处理文件名称
grep root passwd ##过滤root关键字所在的行
grep -i root passwd ##忽略大小写过滤root关键字所在的行
grep -E “<root” passwd ##过滤root字符之前没有字符的行
grep -E “root>” passwd ##过滤root字符之后没有字符的行
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A数字 ##显示过滤行以及下面几行
grep -B数字 ##显示过滤行以及上面几行
grep -v ##反向过滤
实验:
cp /etc/passwd .
ls
vim passwd
grep root passwd //搜索含有root关键字的行
grep -E "root|nologin" passwd
grep -e root -e nologin passwd //搜索含有root和nologin的行
grep -i root passwd //忽略大小写
grep -E "\<root" passwd //被搜索字符前不能有字符
grep -E "root\>" passwd //被搜索字符后不能有字符
grep -n halt passwd //显示搜索字符所在行的行号
grep -5 halt passwd //显示含有关键字的行和含有关键字行的上下各5行
grep -B5 halt passwd //显示含有关键字的行及上5行
grep -A5 halt passwd //显示含有关键字的行及下5行
grep root passwd -v //显示不含有root的行
1.2grep字符数量匹配规则
正则表达式 | 含义 |
---|---|
^westos | 以westos关键字开头 |
westos$ | 以westos结尾 |
w…s | w开头s结尾中间含有3个任意字符 |
…s | s结尾前面有3个任意字符 |
* | 字符出现次数任意(即0次到任意次) |
? | 字符出现0到1次 |
+ | 字符出现1次到任意次 |
{n} | 字符出现n次 |
{m,n} | 字符出现m到n次 |
{,n} | 字符出现0到n次 |
{m,} | 字符最少出现m次 |
(lee){2} | lee字符串出现2次 |
grep root passwd
grep ^root passwd //以root开头
grep root$ passwd //以root结尾
实验环境:
vim westos
cat westos
ws
was
wbs
waas
waaas
waaaas
wadads
wadadads
实验:
“ . ” 代表任意字符
grep ws westos
grep w.s westos
grep w..s westos
grep w...s westos
2.sed
sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
sed 's/nologin/westos/g' passwd
vim rule
cat rule
sed -f rule passwd
1.1对字符的处理
p : 显示
sed 5p passwd //打印第五行
sed -n 5p passwd //只输出被处理内容
cat -b passwd | sed -n 3,5p //3-5行
cat -b passwd | sed -n '3p;5p' //3和5行
sed -n '/^root/p' passwd //root开头
sed -n '/bash$/p' passwd // bash结尾
sed -n '5,$p' passwd // 5到最后以行
sed -n '$p' passwd //最后一行
d:删除
cat -b passwd | sed '5d' 删除第5行
cat -b passwd | sed '5,8d' 5-8行
cat -b passwd | sed -e '5d;8d' 5和8行
sed -e '/^root/d' passwd root开头
sed -e '/bash$/d' passwd bash结尾
sed -e 'd' passwd 删除全部
a :添加
sed '2aleo' westos 在第2行后添加
sed '/hello/aleo' westos 在hello的下面添加
sed '$aleo' westos 添加到最后一行
sed '$aleo\nwestoslinux' westos 最后添加两行 leo、westoslinux
c :替换
sed '1chhaha' westos 将第1行换成hhaha
sed '/linux/chaha' westos 将linux换成haha
w 把符合的行写到指定文件中
sed ‘/^UUID/w westofile’ westos ##把westos中UUID开头的行写入westosfile中
i :插入
sed ‘/westos/iwestosfile’ westos
r :整合文件
sed '2rlee' westos
sed '/hello/rlee' westos
2.2 sed 字符替换
sed 's/nologin/westos/g' passwd
sed '4,5s/nologin/westos/g' passwd
sed '$s/nologin/westos/g' passwd
sed '/lp/,/sssd/s/sbin/westos/g' passwd
sed 's/\//#####/g' passwd
sed 's@/@#####@g' passwd
sed 's@/@#####@g' -i passwd //将更改的内容保存到源文件
将全文的nologin替换成westos
将4,5行的nologin替换成westos
将最后一行的nologin替换成westos
将lp到sssd之间的sbin替换成westos
将/替换成#####
将/替换成#####
3.awk
字符 | 含义 |
---|---|
NR | 行数 |
NF | 列数 |
FILENAME | 文件名称本身 |
westos | 变量值 |
“westos” | 字符串 |
设定westos=1,每处理一行westos+1,最后输出总值
awk -F : '/nologin$|{print $1,$7}' passwd
/bash$/ #条件
awk -F : '/nologin$|^root/{print $1,$7}' passwd
/条件1|条件2/ #条件1或者条件2
awk -F : '/nologin$/||/^root/{print $1,$7}' passwd
/条件1/||/条件2/ #条件1或者条件2
wk -F : '/bash$/&&/^root/{print $1,$7}' passwd
/条件1/&&/条件2/ #条件1并且条件2
$0#所有的列
$1#第一列
$2#第二列
$3#第三列
显示第七列是以bash结尾的
课后练习:命令练习:统计在系统中能su切换的且用户家目录不在/home下的用户数量
思路:使用awk命令以:为分隔符截取/etc/passwd文件中第六列不以/home开头的(/需要转译;不能直接写不含有home关键字,存在类似用户家目录为/tmp/home这种情况)、并且以bash或sh结尾的行,对截取结果进行计数
awk -F : 'BEGIN{N=0}$6!~/^\home/&&/bash$|sh$/{N++}END{print N}' /etc/passwd