linux文件/文本处理工具

  • 正则表达式
    • 正则表达式是什么?
    • 正则表达式如何使用
  • grep
    • grep是什么
    • grep语法
    • grep使用案例
  • sed
    • sed与vim的区别
    • sed语法
    • sed案例
    • flag字段
  • awk
    • awk是什么
    • awk语法
    • awk的使用
    • awk的变量与数组
    • awk运算(赋值运算,比较运算,数学运算,逻辑运算,)
    • awk的环境变量
    • awk的流程控制
    • awk小技巧
  • 六、习题
  • 总结

正则表达式

正则表达式是什么?

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

正则表达式如何使用

特殊字符

定位符

当^$同时一起使用,做精准匹配;

匹配符

限定符

测试文件: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/nologin6666666666666666666666666A1
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擅长对数据进行增、删、改、查等一系列操作;

linux文件/文本处理工具相关推荐

  1. linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了

    原标题:搞定 Linux Shell 文本处理工具,看完这篇集锦就够了 Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替.既然是基本功,那就需要掌握,毕 ...

  2. linux隔行打印文本,详解正则表达式及Linux三大文本处理工具

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了. 一.正则表达式 1.匹配字符的类型 [ ...

  3. debug内exe文件复制到桌面无法打开_Diffinity.轻量级的文件|文本对比工具

    Diffinity是一款非常轻量级的文件与文本对比的小工具软件,软件的安装包仅475KB,同时支持高亮显示.插入显示.集成到资源管理器(右键菜单)等,非常的方便实用.并且最近的一次更新是在9月初,生命 ...

  4. linux全局搜索是什么,linux之文本搜索工具(grep、egrep)用法

    linux操作系统的一项重要的法则就是一切皆文件,然而对于初学者来说最头疼的一件事就是linux庞大文件系统的管理,对于一些文本文件的查找所搜等无从下手,特别是对于习惯于windows操作系统的大家来 ...

  5. linux 文件夹同步工具

    背景: 这篇文放到一群共享里,网上被摘抄了一下,但未注明出处.这里申明一下,摘抄可以,但请注明出处.同样,也是未完之作. 几种文件夹同步工具介绍 1 前言 我们日常工作中,经常会遇到下面的一些情况:静 ...

  6. linux 大文件编辑sed,Linux高级文本处理工具之sed(一)

    sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模 ...

  7. 史上最全的 Linux Shell 文本处理工具集锦,快收藏!

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自:大CC 链接:www.cnblogs.com/me15/p/3427319.html 本 ...

  8. shell脚本教学进阶——Linux三大文本处理工具之grep

    1.简介 Linux系统中grep命令是一种强大的文本搜索.查找过滤工具,,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular Expression Prin ...

  9. 超全的 Linux Shell 文本处理工具集锦,快收藏

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 大CC 来源 | www.cnblogs.co ...

最新文章

  1. 同步和异步的区别和联系以及一般在什么情况下使用它们
  2. 基于VTK的MFC应用程序开发(2)
  3. 【NLP】含10,000 Python问题,伯克利联合团队推出新的代码生成评价基准
  4. python3连接mysql使用mysqldb_Python3 连接Mysql数据库
  5. macosx jdk_MacOSX环境上的多个Java JDK
  6. 不提拔你,就是因为你只想把工作做好
  7. hibernate dialect 方言 sqlserver2000 的方言
  8. LQR轨迹跟踪算法Python算法实现3
  9. linux mutex 数量上限,互斥量mutex
  10. 华中科技大学计算机暑期夏令营,2019年华中科技大学计算机专业夏令营
  11. ar nm ldd 静态库 动态库
  12. android 崩溃捕获_Android从相机和图库捕获图像
  13. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
  14. Color-UI 简介及使用教程
  15. windows10下F1-F11快捷键及window+Dor+E快捷键打开关闭控制
  16. 电脑城 Ghost XP SP3 笔记本专用版 2012.10
  17. 华为社招面试(拿到offer)
  18. 微信小程序一 全局变量/js使用详解
  19. 更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???
  20. 限制_blank属性只打开一个新页签

热门文章

  1. unity随机生成怪物(抽奖)代码
  2. 八成互联网电视系统非法采集用户数据;前亚马逊工程师被定罪;雅虎将在香港测试元宇宙技术 | 每日大事件...
  3. 《猿族崛起》动作捕捉技术及制作流程详解
  4. 云原生运行时的下一个五年
  5. 北斗GPS天线使用中注意的问题
  6. Android工程师应该具备的四大开发习惯
  7. raid是什么?raid的工作原理分析及raid数据恢复思路
  8. 【Linux】安装Linux8报错Network boot from AMD Am79C970A
  9. Zed Shaw:程序员的常见健康问题
  10. Java中文语言处理小结——HanLP