- 『3-2』Linux之文本处理工具
-
- 一、grep [Globally search a Regular Expression and Print ]
-
- grep 格式 `grep 匹配条件 处理文件`
-
- `grep root passwd` 过滤root关键字
- `grep ^root passwd` 以root开头
- `grep -E '^root' passwd` -E 高级正则表达式
- `grep root$ passwd ` 以root结尾
- `grep -i root passwd ` 忽略大小写
- `grep root passwd -v` 反选,选中不带root的
- `grep -E "^root" passwd` 以root开头
- `grep -E "root$" passwd` 以root结尾
- `grep root passwd | grep -E "^root|root$" -v` 显示过滤字符在中间
- `grep mail passwd`
- `grep -5 mail passwd` 显示过滤行以及上面几行和下面几行
- `grep -B5 mail passwd` 显示过滤行及其上面几行
- `grep -A5 mail passwd` 显示过滤行及其下面几行
- `grep -n mail passwd` 显示匹配的行所在行号
- `grep` 字符数量匹配规则
- `w....s` w开头s结尾中间4个任意字符
- `.....s` s结尾的前面
- 二、`sed` 命令格式:`sed 参数 命令 处理对象`
- 三、awk
『3-2』Linux之文本处理工具
一、grep [Globally search a Regular Expression and Print ]
grep
grep -E = egrep
grep 格式 grep 匹配条件 处理文件
grep root passwd
过滤root关键字
grep ^root passwd
以root开头
grep -E '^root' passwd
-E 高级正则表达式
grep root$ passwd
以root结尾
grep -i root passwd
忽略大小写
grep root passwd -v
反选,选中不带root的
grep -E "\<root" passwd
root字符之前不能有字符
grep -E "\<root\>" passwd
root字符前后均不能有字符
grep -E "^root" passwd
以root开头
grep -E "root$" passwd
以root结尾
grep root passwd | grep -E "^root|root$" -v
显示过滤字符在中间
grep mail passwd
grep -5 mail passwd
显示过滤行以及上面几行和下面几行
grep -B5 mail passwd
显示过滤行及其上面几行
grep -A5 mail passwd
显示过滤行及其下面几行
grep -n mail passwd
显示匹配的行所在行号
grep
字符数量匹配规则
w....s
w开头s结尾中间4个任意字符
.....s
s结尾的前面
二、sed
命令格式:sed 参数 命令 处理对象
sed 参数 处理命令
p
显示(一般引号可加可不加,有;时引号一定要加,单双均可但需配套)
sed -n 5p westos
显示第五行
sed -n 3,5p westos
显示3-5行
sed -ne '3p;5p' westos
显示3和5行
sed -ne 1,5p westos
1-5行
sed -ne '5,$p' westos
5到最后的行
sed -n '/^#/p' fstab
显示以#开头的行
d
sed 5d westos
删除第五行
sed '/^UUID/!d' fstab
除了UUID以外的行都删除
sed -e '5,$d' westos
从第五行删除到
a
添加
sed -e '$a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab
原文件不变
c
替换
sed -e '/^#/c hello world' fstab
sed '5chello world' westos
w
把符合的行写到指定文件中
sed '/^UUID/w westosfile' westos
把westos中UUID开头的行写入westosfile中
i
插入
sed '5ihello westos' westos
r
整合文件
sed ‘5r haha’ westos
sed字符替换
sed 's/:/####/g' westos
sed 's/:/####/' westos
sed '1,5s/:/####/g' westos
sed '1s/:/####/g' westos
sed '1s/:/####/g;5s/:/####/g' westos
sed '/lp/,/halt/s/:/####/g' westos
sed 's/\//####/g' westos
sed 's@/@####@g' westos
sed 's@/@####@g' -i westos
把sed处理的内容保存到westos文件中
三、awk
FILENAME
文件名称本身
awk -F : '{ print FILENAME }'
打印文件名,有多少行打印多少次
[root@node26 mnt]# awk -F : '{print FILENAME}' passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
[root@node26 mnt]# awk -F : '{print FILENAME}' passwd |wc -l
54
[root@node26 mnt]# cat passwd | wc -l
54
[root@node26 mnt]#
awk -F : 'BEGIN {print "WESTOS"}'
开始打印,后面可不接文件
root@node126 ~]# awk -F : 'BEGIN{print "WESTOS"}'
WESTOS
[root@node126 ~]#
NR 行数
[root@node126 ~]# awk -F : '{print NR}' /mnt/passwd
1
2
3
4
5
[root@node126 ~]# cat /mnt/passwd | wc -l
5
[root@node126 ~]#
NF 列数
{print HELLO}
[root@node126 ~]# awk -F : '{print HELLO}' /mnt/passwd
#这里的HELLO是变量,未指定,所以打印为空
[root@node126 ~]#
[root@node126 ~]# HELLO=98 ##外部定义无效
[root@node126 ~]# awk -F : '{print HELLO}' /mnt/passwd
[root@node126 ~]# awk -F : 'HELLO=98{print HELLO}' /mnt/passwd
#awk内部定义变量才有效
98
98
98
98
98
[root@node126 ~]#
-F 后面默认是空格,空格时可省略-F.
‘{print $0}’ 这里必须用单引
,双引会报错
空格分隔时,以单个空格为分隔
[root@node126 logs]# cat test |awk "{print $0}"
0
0
[root@node126 logs]# cat test |awk "{print $1}"
5 192.168.1.26
3 172.25.254.26
[root@node126 logs]# cat test |awk '{print $1}'
#空格分隔时,`以单个空格为分隔`
5
3
[root@node126 logs]# cat test |awk '{print $2}'
192.168.1.26
172.25.254.26
[root@node126 logs]#
westos westos变量值
“westos” westos字符串
[root@node126 ~]# awk -F : 'BEGIN{print HELLO}' /mnt/passwd
[root@node126 ~]# awk -F : 'BEGIN{print "HELLO"}' /mnt/passwd
HELLO
[root@node126 ~]#
/bash$/
条件
/^squid/
条件
某东面试题
/etc/passwd文件使用awk匹配squid用户,并打印其用户ID,passwd文件格式如下∶
squid1:x:500:500:/home/squid1:/bin/bash
squid2:x:500:500:/home/squid2:/bin/bash
[root@node126 ~]# awk -F : '/^lp/{print $3}' /mnt/passwd
4
[root@node126 ~]# awk -F : '/^root/{print $3}' /mnt/passwd
0
[root@node126 ~]# awk -F : '/^root/{print $0}' /mnt/passwd
root:x:0:0:root:/root:/bin/bash
[root@node126 ~]#
/条件1|条件2/
条件1或者条件2
/条件1/||/条件2/
条件1或者条件2
/条件1/&&/条件2/
条件1并且条件2
awk 'NR==2{print $0}' userlist
NR==2时
$0
所有的列
$1
第一列
$2
第二列
$3
第三列
/etc/passwd文件的第六列没有home关键字并且以bash结尾的行
awk -F : ‘$6!~/home/&&/bash$/{print}’ /etc/passwd
练习: