linux文件/文本处理工具

正则表达式

正则表达式是什么?

就正则表达式中提供的一些特殊字符,组成一个公式,从文件中提取你所需要的东西;

正则表达式如何使用

特殊字符

定位符

当^$同时一起使用,做精准匹配;
在这里插入图片描述

匹配符
在这里插入图片描述

限定符
在这里插入图片描述

测试文件:passwd

[root@centos-node1 ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

6

666

666666


6666666

66666666

A1
A2
A3
A4
www.baidu.com
476155395@qq.com
www.sina.com
13874902831@163.com
xxxxx@xx.com.cn

  • 查看以root开头的行
[root@centos-node1 ~]# cat /etc/passwd   | egrep  "^root"
root:x:0:0:root:/root:/bin/bash
  • 查看以bash结尾的行
[root@centos-node1 ~]# cat /etc/passwd   | egrep  "bash$"
root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000:admin:/home/admin:/bin/bash
  • 查看以adm开头,nologin结尾的行,.代表任意匹配一个字符,*代表这个字符不出现,或者出现多次,.*即任意一个字符出现一次或者多次(即不限制)
[root@centos-node1 ~]# cat passwd  | egrep   "^adm.*nologin$"
adm:x:3:4:adm:/var/adm:/sbin/nologin
  • 查找文件中的空行(^$代表空行)
[root@centos-node1 ~]# cat passwd  | egrep   "^$"








  • 查找以adm开头,以nologin或者bash结尾的内容
[root@centos-node1 ~]# cat passwd  | egrep  "^adm.*(bash|nologin)"
adm:x:3:4:adm:/var/adm:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash
  • 查找以数字开头的
[root@centos-node1 ~]# cat passwd  | egrep   "^[0-9]"
6
666
666666
6666666
66666666
476155395@qq.com
13874902831@163.com
  • 查找除了以小写字母开头的内容
[root@centos-node1 ~]# cat passwd  | egrep   "^[^a-z]"
6
666
666666
6666666
66666666
A1
A2
A3
A4
476155395@qq.com
13874902831@163.com

POSIX字符
在这里插入图片描述

  • 匹配以大写字母开头的行
cat passwd  | egrep   "[[:upper:]]*"
  • 匹配以小写字母开头的行
cat passwd  | egrep  "[[:lower:]]*"
  • 匹配数字开头的行
cat passwd  | egrep  "[[:digit:]]*"
  • 匹配标点符号
cat passwd  | egrep  "[[:punct:]]*"

实用的正则表达式公式:

  • 匹配email地址:
[root@centos-node1 ~]# cat passwd  | grep  -E "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"
476155395@qq.com
13874902831@163.com
xxxxx@xx.com.cn
  • 匹配域名:
[root@centos-node1 ~]# cat passwd  | grep  -E "[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?"
www.baidu.com
476155395@qq.com
www.sina.com
13874902831@163.com
xxxxx@xx.com.cn
https://www.baidu.com
http://baidu.com

匹配URL

[root@centos-node1 ~]# cat passwd  | grep  -E "[a-zA-Z]+://[^\s]*"
https://www.baidu.com
http://baidu.com

grep

grep是什么

是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep语法

grep [OPTION]… PATTERN [FILE]…

grep+选项+目标文件

选项
grep --help
匹配模式选择:
-E, --extended-regexp 扩展正则表达式egrep
-F, --fixed-strings 一个换行符分隔的字符串的集合fgrep
-G, --basic-regexp 基本正则
-P, --perl-regexp 调用的perl正则
-e, --regexp=PATTERN 后面根正则模式,默认无
-f, --file=FILE 从文件中获得匹配模式
-i, --ignore-case 不区分大小写
-w, --word-regexp 匹配整个单词
-x, --line-regexp 匹配整行
-z, --null-data 一个 0 字节的数据行,但不是空行

杂项:
-s, --no-messages 不显示错误信息
-v, --invert-match 显示不匹配的行
-V, --version 显示版本号
–help 显示帮助信息
–mmap use memory-mapped input if possible

输入控制:
-m, --max-count=NUM 匹配的最大数
-b, --byte-offset 打印匹配行前面打印该行所在的块号码。
-n, --line-number 显示的加上匹配所在的行号
–line-buffered 刷新输出每一行
-H, --with-filename 当搜索多个文件时,显示匹配文件名前缀
-h, --no-filename 当搜索多个文件时,不显示匹配文件名前缀
–label=LABEL print LABEL as filename for standard input
-o, --only-matching 只显示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不显示任何东西
–binary-files=TYPE 假定二进制文件的TYPE 类型;
TYPE 可以是binary',text’, 或`without-match’
-a, --text 匹配二进制的东西
-I 不匹配二进制的东西
-d, --directories=ACTION 目录操作,读取,递归,跳过
-D, --devices=ACTION 设置对设备,FIFO,管道的操作,读取,跳过
-R, -r, --recursive 递归调用
–include=PATTERN 只查找匹配FILE_PATTERN 的文件
–exclude=PATTERN 跳过匹配FILE_PATTERN 的文件和目录
–exclude-from=FILE 跳过所有除FILE 以外的文件
-L, --files-without-match 匹配多个文件时,显示不匹配的文件名
-l, --files-with-matches 匹配多个文件时,显示匹配的文件名
-c, --count 显示匹配的行数
-Z, --null 在FILE 文件最后打印空字符

文件控制:
-B, --before-context=NUM 打印匹配本身以及前面的几个行由NUM控制
-A, --after-context=NUM 打印匹配本身以及随后的几个行由NUM控制
-C, --context=NUM 打印匹配本身以及随后,前面的几个行由NUM控制
-NUM 根-C的用法一样的
–color[=WHEN],
–colour[=WHEN] 使用标志高亮匹配字串;

-U, --binary 使用标志高亮匹配字串;
-u, --unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)

grep使用案例

#过滤带有root的行
[root@centos-node1 ~]# grep  "root" passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#过滤带有root或者admin的行
[root@centos-node1 ~]# grep -E  "(root|admin)" passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash

#过滤带有root这个单词的行
[root@centos-node1 ~]# grep -w  "root" passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#显示不带root的行
grep -w  "root" passwd

显示带有root的行,并显示行号
[root@centos-node1 ~]# grep -n  "root" passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/sadroot:/sbin/nologin

显示所有的行号
```javascript
grep -nE ".*"  passwd
[root@centos-node1 ~]# grep  -nE ".*" passwd 

#在跟踪日志的时候可以过滤类型为warn或者err的日志,打印上下三行
[root@centos-node1 ~]# tail -f /var/log/secure | grep -iE ‘(warn|err)’ -A3 -B3

sed

sed是一个流编辑器,能够在非交互式的环境下对文本的内容进行操作;
在这里插入图片描述

sed与vim的区别

vim是编辑这个文件然后进行修改,流程是将这个文件读入内存中,适用于小文件;
sed可以实现非交互的修改,流程是读入文件的某一行,进行修改,适用于大文件;

sed语法

sed [OPTION]… {script-only-if-no-other-script} [input-file]…
sed + 选项 + 执行的操作 +执行的位置{flag} + 文件名

选项:
sed -h
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表
–follow-symlinks 直接修改文件时跟随软链接
-i [扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N 指定“l”命令的换行期望长度
–posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
–help 打印帮助并退出
–version 输出版本信息并退出
-a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
-s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

sed案例


#在第三行后面追加内容(默认不加行号则在每一行后面增加)

[root@centos-node1 sed]# sed "3a\hello world" test 
www.baidu.com
www.sina.com
www.qq.com
hello world
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family 

#匹配模式,匹配到相应数据的行以后在这行后面添加内容

[root@centos-node1 sed]# sed "/172/a\hello world" test 
www.baidu.com
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
hello world
ip139
we are family

#在目标行前面插入

[root@centos-node1 sed]# sed "/www.sina.com/i\sed test" test 
www.baidu.com
sed test
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family


#删除目的行内容

[root@centos-node1 sed]# sed "/www.qq.com/d" test 
www.baidu.com
www.sina.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family

#将文件中空行以及以#开头的文件删除


cat "#666" >> test 
echo   >> test
[root@centos-node1 sed]# sed -r  "/(^$|^#|#)/d" test 
www.baidu.com
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family

#删除第1行

sed '1d' passwd 

#删除1-8行

sed '1,8d' passwd 


#使用"s///"进行替换修改

[root@centos-node1 sed]# sed "s#www#https:.//www#" test 
idu.com
https:.//www.sina.com
https:.//www.qq.com
https:.//www.hao123.com
https:.//www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family 

#把baidu.com替换为https://baidu.com

[root@centos-node1 sed]# sed "/baidu.com/s#baidu.com#https://www.baidu.com#" test 
https://www.baidu.com
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family 

#将sina.com修改成https://www.sina.com

[root@centos-node1 sed]# sed "/sina.com/c\https://www.sina.com" test 
baidu.com
https://www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family

#将第3行改成test.sed.com

[root@centos-node1 sed]# sed "3c\test.sed.com" test 
baidu.com
www.sina.com
test.sed.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family 

#特殊,使用sed “3,4c\test” 默认会将3-4行删除,加入test这一行;

#字符大小写的转换

[root@centos-node1 sed]# sed 'y/abcdefg/ABCDEFG/' test 
BAiDu.Com
www.sinA.Com
www.qq.Com
www.hAo123.Com
www.666.Com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
wE ArE FAmily 


sed “\baidu.com” \ \ 内为要查找的内容

flag字段

即执行动作的位置,比如一行里有多个匹配的对象,替换第几个,还是全部替换;
在这里插入图片描述

在源文件最后一行添加多个重复内容

[root@centos-node1 sed]# cat test 
baidu.com    
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family   we are family we are family we are family we are family

#替换匹配的内容第2个内容:数字

[root@centos-node1 sed]# sed "/we/s#we are family#666#2" test 
baidu.com    
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we are family   666 we are family we are family we are family

#全局替换匹配的内容:g
g

[root@centos-node1 sed]# sed "/we/s#we are family#666#g" test 
baidu.com    
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
666   666 666 666 666

#将替换的内容结果写入新文件:w

[root@centos-node1 sed]# sed "/we/s#we are family#666#gw 66666 " test 
baidu.com    
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
666   666 666 666 666

[root@centos-node1 sed]# ls
66666   test

#只打印修改的某一行:p打印,-n是静默,只打印需要的数据

[root@centos-node1 sed]# sed -n "/ip139/a\sed.test" test 
sed.test

#执行多个条件,-e

[root@centos-node1 sed]# sed -e "/we/s#are#6666#1;/we/s#are#77777#" test 
baidu.com    
www.sina.com
www.qq.com
www.hao123.com
www.666.com
15677789540
13888282488
192.168.100.100
172.16.0.1
ip139
we 6666 family   we 77777 family we are family we are family we are family

#指定命令文件,一次执行 -f

1、编写sed.txt文件
2、执行

[root@centos-node1 sed]# cat sed.txt 
/^172/d
/138/a\888888
/www.hao123.com/i\www.aiqiyi.com

[root@centos-node1 sed]# sed -f sed.txt test 
baidu.com    
www.sina.com
www.qq.com
www.aiqiyi.com
www.hao123.com
www.666.com
15677789540
13888282488
888888
192.168.100.100
ip139
we are family   we are family we are family we are family we are family


将源文件备份,同时修改源文件(推荐的方式,出现错误,可还原) -i.xxx

[root@centos-node1 sed]# sed  -r -i.bak "/^172/d" test 
[root@centos-node1 sed]# ls
66666   sed.txt  test  test.bak

awk

awk是什么

使用cut、grep命令能够从一个数据中截取相对应的行以及列获取相对应的数据,可以对数据进行操作;

awk语法

awk [options] [BEGIN] [program] [END] [file]
BEGIN: 在处理数据流之前,需要干什么,他不需要有数据流;
program:只负责处理数据流
END:处理完数据流以后什么

选项
-F 紧跟分隔符,表示读入的字段以输入的分隔符分割
-v 进入变量模式 可以进行变量的赋值及调用(调用不需要加$符)

1,变量

变 量 描述
$n 当前记录的第n个字段,字段间由 FS分隔。
$0 完整的输入记录。
ARGC 命 令行参数的数目。
ARGIND 命令行中当前文件的位置(从0开始算)。
ARGV 包 含命令行参数的数组。
CONVFMT 数字转换格式(默认值为%.6g)
ENVIRON 环 境变量关联数组。
ERRNO 最后一个系统错误的描述。
FIELDWIDTHS 字 段宽度列表(用空格键分隔)。
FILENAME 当前文件名。
FNR 同 NR,但相对于当前文件。
FS 字段分隔符(默认是任何空格)。
IGNORECASE 如 果为真,则进行忽略大小写的匹配。
NF 当前记录中的字段数。
NR 当 前记录数。
OFMT 数字的输出格式(默认值是%.6g)。
OFS 输 出字段分隔符(默认值是一个空格)。
ORS 输出记录分隔符(默认值是一个换行符)。
RLENGTH 由 match函数所匹配的字符串的长度。
RS 记录分隔符(默认是一个换行符)。
RSTART 由 match函数所匹配的字符串的第一个位置。
SUBSEP 数组下标分隔符(默认值是\034)。

2,运算符

运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻 辑或
&& 逻辑与
~ !~ 匹 配正则表达式和不匹配正则表达式
< <= > >= != == 关 系运算符
空格 连接

    • 加,减
  • / & 乘,除与求余
    • ! 一元加,减和逻辑非
      ^ *** 求幂
      ++ – 增加或减少,作为前缀或后缀
      $ 字 段引用
      in 数组成员

3,awk的正则

匹配符 描述
\Y 匹配一个单词开头或者末尾的空字符串
\B 匹配单词内的空字符串
< 匹配一个单词的开头的空字符串,锚定开始
> 匹配一个单词的末尾的空字符串,锚定末尾
\W 匹配一个非字母数字组成的单词
\w 匹配一个字母数字组成的单词
’ 匹配字符串末尾的一个空字符串
\‘ 匹配字符串开头的一个空字符串

4,字符串函数

函数名 描述
sub 匹配记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的 时候
gsub 整个文档中进行匹配
index 返回子字符串第一次被匹配的位置,偏移量从位置1开始
substr 返回从位置1开始的子字符串,如果指定长度超过实际长度,就返回整个字符串
split 可按给定的分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前FS值进行分割
length 返回记录的字符数
match 返回在字符串中正则表达式位置的索引,如果找不到指定的正则表达式则返回0。match函数会设置内建变量RSTART为字符串中子字符串的开始位 置,RLENGTH为到子字符串末尾的字符个数。substr可利于这些变量来截取字符串
toupper和tolower 可用于字符串大小间的转换,该功能只在gawk中有效

5,数学函数

函数名 返回值
atan2(x,y) y,x 范围内的余切
cos(x) 余弦函数
exp(x) 求 幂
int(x) 取整
log(x) 自然对 数
rand() 随机数
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函数的种子
int(x) 取 整,过程没有舍入
rand() 产生一个大于等于0而小于1的随机数

6,format的使用

要点:
1、其与print命令的最大不同是,printf需要指定format;
2、format用于指定后面的每个item的输出格式;
3、printf语句不会自动打印换行符;\n

format格式的指示符都以%开头,后跟一个字符;如下:
%c: 显示字符的ASCII码;
%d, %i:十进制整数;
%e, %E:科学计数法显示数值;
%f: 显示浮点数;
%g, %G: 以科学计数法的格式或浮点数的格式显示数值;
%s: 显示字符串;
%u: 无符号整数;
%%: 显示%自身;

修饰符:
N: 显示宽度;
-: 左对齐;
+:显示数值符号;

awk的使用

#awk打印指定行指定列 NR

[root@centos-node1 ~]# awk -F ":" 'NR==3{print $1} ' passwd 
daemon

#awk指定顺序打印

[root@centos-node1 ~]# awk -F ":" 'NR==3{print $7 ":" $6 ":" $"2"}' passwd 
/sbin/nologin:/sbin:x

awk的变量与数组

#awk能够支持变量:使用awk赋值给变量,计算内存利用率;

[root@centos-node1 ~]# head -2 /proc/meminfo 
MemTotal:        3861512 kB
MemFree:         3457992 kB
[root@centos-node1 ~]# head -2 /proc/meminfo  | awk 'NR==1{t=$2}NR==2{f=$2;print(t-f)*100/t "%"}'
10.4568%

#awk能够支持数组:使用awk给数组赋值

[root@centos-node1 ~]# awk 'BEGIN{array[1]="zhangzh";array[2]=18;print array[1],array[2]}'
zhangzh 18

awk运算(赋值运算,比较运算,数学运算,逻辑运算,)

比较运算:
#打印出第一列大于5的数字

[root@centos-node1 ~]# awk '$1>5{print $0}' num 
6
7
8
9
10

#打印出第一列小于5的数字

[root@centos-node1 ~]# awk '$1<5{print $0}' num 
1
2
3
4

#打印出第一列等于5的数字

[root@centos-node1 ~]# awk '$1==5{print $0}' num 
5

数学运算:(+ - * / ** % ++ --)

[root@centos-node1 ~]# awk "BEGIN{print 100+1}"
101
[root@centos-node1 ~]# awk "BEGIN{print 100-1}"
99
[root@centos-node1 ~]# awk "BEGIN{print 100*1}"
100
[root@centos-node1 ~]# awk "BEGIN{print 100/1}"
100
[root@centos-node1 ~]# 
[root@centos-node1 ~]# awk "BEGIN{print 100**1}"
100
[root@centos-node1 ~]# awk "BEGIN{print 100%1}"
0
[root@centos-node1 ~]# awk -v  conut=0 'BEGIN{count--;print count --}'
-1
[root@centos-node1 ~]# awk -v  conut=0 'BEGIN{count--;print count ++}'
-1

逻辑运算:

[root@centos-node1 ~]# awk 'BEGIN{print 1 -eq 2 || 2 -gt 1}'
1

[root@centos-node1 ~]# awk 'BEGIN{print 1 -eq 2 && 2 -gt 1}'
0

匹配运算

基于字符的匹配(精确第一行匹配为root的,不匹配在前面加!)

[root@centos-node1 ~]# awk -F ":" ' $1 == "root"{print $0}' passwd 
root:x:0:0:root:/root:/bin/bash

基于字符的模糊匹配(模糊匹配第一行为adm的)

[root@centos-node1 ~]# awk -F ":" ' $1 ~ "ad"{print $0}' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash

awk的环境变量

在这里插入图片描述
指定分隔符为:,打印第1列等同于awk -F “:” ‘{print $1}’

[root@centos-node1 ~]# awk  'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
admin
apache

定义字符的宽度

[root@centos-node1 ~]# awk  'BEGIN{FIELWIDTHS="5 2 8"}{print $1}' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd
dbus:x:81:81:System
polkitd:x:999:998:User
sshd:x:74:74:Privilege-separated
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
admin:x:1000:1000:admin:/home/admin:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

指定行与行的分隔符为" "(空格),打印1-10行

[root@centos-node1 ~]# awk  'BEGIN{RS=" "}{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10}' num
1 2 3 4 5 6 7 8 9 10

awk的流程控制

if判断
for循环
while循环
until循环
sleep
continue
break

if判断语句
#判断大于5的打印到屏幕

[root@centos-node1 ~]# awk '{if($1>5)print $0}' num 
6
7
8
9
10

#if-else语句

[root@centos-node1 ~]# awk '{if($1>5)print 6;else print 666666}' num 
666666
666666
666666
666666
666666
6
6
6
6
6

#列的累加

[root@centos-node1 ~]# awk -v 'sum=0' '{sum+=$1}END{print sum}' num
55

for循环
#行的累加

[root@centos-node1 ~]# cat num2 
200 200 200
100 100 100
66 66 66

[root@centos-node1 ~]# awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2 
600
300
198

while循环

awk小技巧

#打印文本的行数

[root@centos-node1 ~]# awk 'END{print NR}' /etc/passwd 
20

#打印文本最后一行内容

[root@centos-node1 ~]# awk 'END{print $0}' /etc/passwd 
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

#打印文本列数

[root@centos-node1 ~]# awk 'END{print NF}' num2 
3

六、习题

匹配A,B,C类IP地址

匹配正确的电话号码

access.log 相关字段如何匹配 URL

匹配域名

匹配email

DNS检测web服务器脚本(DNS给web1,web2添加两条A记录达到负载的效果,但是DNS需要检测web的存活状态,如果出现down机则将解析全部指向另外一台机器)

写一个交互式的脚本,用户管理Apache虚拟主机
1)增加虚拟主机
2)修改虚拟主机属性 DR 访问日志 错误日志 绑定域名
3)删除虚拟主机
4)打印虚拟主机列表

某个进程使用了多少内存?

总结

正则表达式是我们在很多的数据中按照特定的特征定义公式去抓取数据的一个工具,它是一个通用的工具,在linux中,常见的可以调用正则表达式的命令有grep、sed、awk;
grep 擅长根据数据特征去过滤行,或者过滤我们想要的具体内容;
awk 擅长根据数据内容去过滤行以及列,能够将内容根据需求排列组合,以及计算,能够定义变量,数组,以及进行运算,流程控制(判断if,循环(for,while),控制(sleep,continue,break))
sed grep和awk不会修改源文件,而sed能够修改源文件,且能够修改源文件以后对源文件进行备份,同时sed擅长对数据进行增、删、改、查等一系列操作;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值