Linux 系统中文本处理有多种不同的方式,系统为我们提供了三个实用命令,来实现对行列的依次处理功能,grep命令文本过滤工具,cut列提取工具,sed文本编辑工具,以及awk文本报告生成工具,利用这三个工具可以灵活的过滤截取任何系统文本内容。

Grep 文本过滤工具

grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,在Linux系统中是最常用的行匹配提取工具.

[root@localhost ~]# grep --help

命令语法:[ grep [选项] [过滤菜单] 文件名 ]

        -a              #将二进制数据一同列出
-c #计算找到查找字符串的次数
-i #忽略大小写差异
-n #标号显示
-v #反选参数
-q #不显示任何提示信息,安静模式
-E #使用扩展正则,egrep
-A #匹配指定字符的后n个字符
-B #匹配指定字符的前n个字符
-C #匹配指定字符的前n个和后n个字符

匹配任意多次字符: 使用*实现匹配前一个字符出现0次或任意多次(本例则是匹配g字符出现0次或任意多次)

[root@localhost ~]# ls
blog bloog blooog [root@localhost ~]# ls | grep -o "blo*g"
blog
bloog
blooog

匹配任意一个字符: 使用.实现匹配除换行符以外的任意一个字符,(只匹配一个字符),一般我们把这种匹配模式叫做贪婪匹配

[root@localhost ~]# ls
blog bloog blooog [root@localhost ~]# ls | grep -o "blo.g"
bloog
[root@localhost ~]# ls | grep -o "blo..g"
blooog

匹配行首行尾字符: 使用^匹配行首是指定字符的文本,相反使用$匹配行尾是指定字符的文本

[root@localhost ~]# ls
alert lyshark tcpl wakaka wang wangg wanggg woxin [root@localhost ~]# ls | grep "^ly"
lyshark
[root@localhost ~]# ls | grep "^a"
alert
[root@localhost ~]# ls | grep "a$"
wakaka
[root@localhost ~]# ls | grep "ark$"
lyshark
[root@localhost ~]# ls | grep "^w" | grep "n$"
woxin

匹配括号范围以内字符: 使用[]匹配中括号内任意一个字符,只匹配其中一个

[root@localhost ~]# ls
ale1t ale2t ale3t aleat alebt alert [root@localhost ~]# ls | grep "ale[a-z]t"
aleat
alebt
alert
[root@localhost ~]# ls | grep "ale[0-9]t"
ale1t
ale2t
ale3t
[root@localhost ~]# ls | grep "ale[ab]t"
aleat
alebt

匹配括号范围以外字符: 使用[^]匹配除了中括号字符以外的任意一个字符,符号^取反的意思.

[root@localhost ~]# ls
ale1t ale2t ale3t aleat aleAt aleBB alebt aleCT aleEt alert [root@localhost ~]# ls | grep "ale[^0-9]t"
aleat
aleAt
alebt
aleEt
alert
[root@localhost ~]# ls | grep "ale[^A-Z]t"
ale1t
ale2t
ale3t
aleat
alebt
alert
[root@localhost ~]# ls | grep "ale[^AE]t"
ale1t
ale2t
ale3t
aleat
alebt
alert

匹配行首某字符: 使用^[^]匹配行首是与不是指定字符的行,匹配行首是否是或不是某一个字符的记录.

[root@localhost ~]# ls
ale1t ale2t lyshark tcpl wakaka wang wangg wanggg woxin [root@localhost ~]# ls | grep ^[a] #匹配行首是a开头
ale1t
ale2t
[root@localhost ~]# ls | grep ^[^a] #匹配行首不是a开头
lyshark
tcpl
wakaka
wang
wangg
wanggg
woxin
[root@localhost ~]# ls | grep -n "^[^a-zA-Z]" #匹配开头不是a-z,A-Z的行
8:123123
9:1233
10:66431
11:124adb

匹配恰好出现次数行: 使用\{n}\匹配前面的字符恰好出现了n次的行

[root@localhost ~]# ls
12333 13466614578 13562653874 172.168.1.2 18264758942 192.168.1.1 45666 78999 [root@localhost ~]# ls | grep -o "123\{3\}"
12333
[root@localhost ~]# ls | grep "[0-9][0-9][0-9]\{3\}" #匹配前两个字符是0-9的,最后一个字符出现过3次的
12333
45666
78999
[root@localhost ~]# ls | grep "[1][3-8][0-9]\{9\}" #匹配手机号规则
13466614578
13562653874
18264758942

匹配不小于出现次数行: 使用\{n,}\匹配前面字符出现,不小于n次的行

[root@localhost ~]# ls
12333 123333 1233333 [root@localhost ~]# ls | grep "123\{3,\}" #前一个字符3的出现不小于3次
12333
123333
1233333
[root@localhost ~]# ls | grep "123\{4,\}" #前一个字符3的出现不小于4次
123333
1233333

匹配不小于且不大于次数行: 使用\{n,m}\匹配前面的字符出现,不小于n次,最多出现m次的行

[root@localhost ~]# ls
123 1233 12333 123333 1233333 12333333 123333333 1233333333 12333333333 [root@localhost ~]# ls |grep "123\{3,5\}" #前一个字符3最少出现3次,最多不大于5次
12333
123333
1233333

匹配出现1次或任意多次的行: 使用+匹配前一个字符出现1次或任意多次的行

[root@localhost ~]# ls
gogle google gooogle gooogooogle goooogle gooooogle goooooogle [root@localhost ~]# ls | grep -E "go+gle"
gogle
google
gooogle
goooogle
gooooogle
goooooogle

匹配出现0次或1次的行: 使用?匹配前一个字符出现过0次或1次,最少0次,最多1次.

[root@localhost ~]# ls
gogle google gooogle gooogooogle goooogle gooooogle goooooogle [root@localhost ~]# ls | grep -E "go?gle"
gogle
[root@localhost ~]# ls | grep -E "goo?gle"
gogle
google

匹配分支选择行: 使用|匹配两个或多个分支选择,从特定分支内选择不同的关键词匹配查询

[root@localhost ~]# ls
alert lyshark rui wang [root@localhost ~]# ls | grep -E "alert|lyshark"
alert
lyshark
[root@localhost ~]# ls | grep -E "wang|rui|alert"
alert
rui
wang

匹配模式单元行: 使用()将字符作为一个整体匹配,即模式单元匹配

[root@localhost ~]# ls
dog dogdog dogdogdog hello_lyshark hello_world [root@localhost ~]# ls | grep -E "(dog)+"
dog
dogdog
dogdogdog
[root@localhost ~]# ls | grep -E "hello_(world|lyshark)"
hello_lyshark
hello_world

匹配日期与时间行: 使用正则匹配文本中的日期与时间

# 匹配24小时时间
[root@localhost ~]# cat | grep -E "^[0-23]{2}:[0-59]{2}:[0-59]{2}"
12:00:00
13:55:00
01:11:22 # 匹配12小时时间
[root@localhost ~]# cat | grep -E "^[0-12]{2}:[0-59]{2}:[0-59]{2}"
12:00:00
01:11:22 # 匹配年月日
[root@localhost ~]# cat | grep -E "^([0-9]{4})-([0-12]{2})-([0-31]{2})"
2019-10-10
2014-01-01 # 匹配并输出/var/log/secure特殊时间格式
[root@localhost ~]# cat | grep -o -E "^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sept|Oct|Nov|Dec) ([0-9]{2})"
Jan 16
Nov 17

过滤空白行与注释行: 过滤掉开头是#号的,和开头是空行的行,实现去掉注释与空白行

[root@localhost ~]# cat lyshark.log | grep -v "^#" | grep -v "^$"
ADMIN
Good
123123
1233.
66431.

匹配开头结尾的行: 匹配开头是0-9且结尾是点的行

[root@localhost ~]# cat lyshark.log |grep -n -E "^[0-9]+\."
9:1233.
10:66431.

匹配IP/MAC相关地址行: 正则匹配IP地址,与匹配MAC地址

# 匹配IPV4地址
[root@localhost ~]# ifconfig | egrep -o "(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])"
192.168.150.128
255.255.255.0
192.168.150.25 # 匹配IPV6地址
[root@localhost ~]# ifconfig | egrep -o "[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){0,7}::[a-f0-9]{0,4}(:[a-f0-9]{1,4}){0,7}"
fe80::d5d5:6d6d:3e86:c3e1 # 匹配MAC地址
[root@localhost ~]# ifconfig | egrep -o "([0-9]|[a-z]){2,2}:([0-9]|[a-z]){2,2}:([0-9]|[a-z]){2,2}:([0-9]|[a-z]){2,2}:([0-9]|[a-z]){2,2}:([0-9]|[a-z]){2,2}"
00:0c:29:72:77:7f # 匹配邮箱(测试)
[root@localhost ~]# egrep -o "^[0-9a-zA-Z][0-9a-zA-Z_]{1,16}[0-9a-zA-Z]\@[0-9a-zA-Z-]*([0-9a-zA-Z])?\.(com|com.cn|net|org|cn)$"

Cut 列提取工具

cut命令用来显示行中的指定部分,删除文件中指定字段,cut经常用来显示文件的内容,类似于type命令.该命令显示文件的内容,它依次读取由参数file所指明的文件,将它们的内容输出到标准输出上.

[root@localhost ~]# cut --help

命令语法:[ cut [选项] [列号] 文件名 ]

        -f              #-f 列号:指定提取第几列
-d #-d 分隔符:按照指定分隔符进行分割
-c #-c 字符范围:不依赖分割符来分割,而是通过字符范围进行字段提取
-m #表示从第一个字符提取到第m个
-b #仅显示行中指定直接范围的内容
-n #与"-b"选项连用,不分割多字节字符
n- #表示从第n个字符开始提取到结尾
n-m #表示从第n提取到第m个字符 --complement #补齐被选择的字节,字符或字段
--out-delimiter=<字段分隔符> #指定输出内容是的字段分割符

手动创建一个文本,添加内容列之间用tab分隔,用来测试后续内容

[root@localhost ~]# cat lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88

通过使用 -f 选项指定过滤的列,并显示到屏幕

[root@localhost ~]# cut -f 2 lyshark.log
NAME
WR
LC
LY
[root@localhost ~]# cut -f 2,5 lyshark.log
NAME Mark
WR 100
LC 90
LY 88

通过使用 --complement 选项提取指定字段之外的列,(打印除了第2列之外的列)

[root@localhost ~]# cut -f 2 --complement lyshark.log

ID      AGE     Gender  Mark
1 22 m 100
2 26 m 90
3 23 m 88

通过使用 -c 选项过滤/etc/passwd,并打印第1个到第3个字符

[root@localhost ~]# cut -c 1-3 /etc/passwd
roo
bin
dae

通过使用 -c -2 选项过滤/etc/passwd,并打印前2个字符

[root@localhost ~]# cut -c -2 /etc/passwd
ro
bi
da

通过使用 -c 5- 选项过滤/etc/passwd,打印从第5个字符开始到结尾

[root@localhost ~]# cut -c 5- /etc/passwd
:x:0:0:root:/root:/bin/bash
x:1:1:bin:/bin:/sbin/nologin

通过使用 -d 指定分隔符 -f 指定打印第个字段,以下我们分别截取第1和第7个字段

[root@localhost ~]# cut -d ":" -f 1,7 /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin

通过使用 -c -3 指定截取前3个字符,还可以通过 -c 3 截取第3个字符

[root@localhost ~]# cut -c -3 /etc/passwd
roo
bin
dae
[root@localhost ~]# cut -c 3 /etc/passwd
o
n
e

Sed 文本流编辑器

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,sed主要是来进行数据选取,替换,删除,新增的命令.

[root@localhost ~]# sed --help

命令语法:[ sed [选项] [范围] [动作] 文件名 ]
-n #把经过sed命令处理的行输出到屏幕
-e #允许对输入数据应用多条sed命令编辑
-f #从sed脚本中读入sed操作,和awk命令的-f类似
-r #在sed中支持扩展正则表达式
-i #用sed的修改结果,写到文件 命令动作:
p #打印,输出指定的行
a #追加,在当前行后添加一行或多行
i #插入,在当前行前插入一行或多行
c #整行替换,用c后面的字符串替换原数据行
d #删除,删除指定的行
s #字串替换,格式:"行范围s/旧字串/新字串/g" #对sed命令我们要知道的是,它所有的修改都不会直接修改文件的内容,而是在内存中进行处理然后打印到屏幕上
#如果想要写入文件,请使用 sed -i 选项才会保存到文本中.

在进行实验之前,首先创建一个文件,来做测试用

[root@localhost ~]# cat lyshark.log

ID      NAME    AGE     Gender  Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100

使用 sed '2p' 重复打印第二行数据

[root@localhost ~]# sed '2p' lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
1 WR 22 m 100 ←本行是2p打印的
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100 [root@localhost ~]# sed '3p' lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
2 LC 26 m 90 ←本行是2p打印的
3 LY 23 m 88
4 XDL 40 b 100

使用 sed -n 限定,只选取指定的行进行显示

[root@localhost ~]# sed -n '2p' lyshark.log  ←只打印第2行数据
1 WR 22 m 100 [root@localhost ~]# sed -n '1p' lyshark.log ←只打印第1行数据
ID NAME AGE Gender Mark

使用 sed '2,4d' 删除掉文件2-4行,并显示到屏幕,(原文件内容并没有被修改)

[root@localhost ~]# sed '2,4d' lyshark.log   ←删除2-4行的数据并打印
ID NAME AGE Gender Mark
4 XDL 40 b 100 [root@localhost ~]# sed '1d' lyshark.log ←删除第1行的数据
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100

使用 sed '2[a|i]' 追加,或者插入数据指定数据

[root@localhost ~]# sed '2a hello lyshark' lyshark.log      ←在第2行后面追加数据
ID NAME AGE Gender Mark
1 WR 22 m 100
hello lyshark
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100 [root@localhost ~]# sed '2i hello lyshark' lyshark.log ←在第2行前面插入数据
ID NAME AGE Gender Mark
hello lyshark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100

使用 \ 换行符,一次插入多行数据

[root@localhost ~]# sed '2a hello \    ←在第二行下面,插入一段话,用\隔开
> my name is lyshark \
> age 22 \
> boy ' lyshark.log ID NAME AGE Gender Mark
1 WR 22 m 100
hello
my name is lyshark
age 22
boy
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100

使用 sed 'c' 实现整行替换数据

[root@localhost ~]# cat lyshark.log | sed '5c 5    WRS    99    m    111'  ←整行替换第5行内容
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
5 WRS 99 m 111

使用 sed 后面跟上 -i 选项,将第5行的修改,保存进文件,(-i选项是回写)

[root@localhost ~]# sed  -i '5c 5     WRS    99    m    111' lyshark.log

[root@localhost ~]# cat lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
5 WRS 99 m 111 ←这里的数据已经写入成功

字符串的替换 sed 's/旧文本/新文本/g' 进行整行替换

[root@localhost ~]# sed '2s/WR/LyShark/g' lyshark.log   ←将第2行的,WR替换成LyShark
ID NAME AGE Gender Mark
1 LyShark 22 m 100
2 LC 26 m 90
3 LY 23 m 88
5 WRS 99 m 111 [root@localhost ~]# sed '3s/LC/Admin/g' lyshark.log ←将第3行的,LC替换成Admin
ID NAME AGE Gender Mark
1 WR 22 m 100
2 Admin 26 m 90
3 LY 23 m 88
5 WRS 99 m 111 #注意:上方只是替换打印,并没有保存,如若想保存请加 -i 属性

将第3行数据的开头添加#注释

[root@localhost ~]# sed '3s/^/#/g' lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
#2 LC 26 m 90
3 LY 23 m 88
5 WRS 99 m 111

将第4和第5行的内容替换成空

[root@localhost ~]# sed -e '4s/LY//g ; 5s/WRS//g' lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 23 m 88
5 99 m 111 #sed 要进行多行操作时,只能通过 -e 写多条操作语句,用 ; 或回车分隔

通过使用grep命令定位到指定行,然后使用sed替换无用字符串,最后实现IP地址的过滤.

[root@localhost ~]# ifconfig | grep "inet 192" |sed 's/^.*inet //g'
192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 [root@localhost ~]# ifconfig |grep "inet 192" |sed 's/^.*inet //g' |sed 's/ netmask.*$//g'
192.168.1.10 [root@localhost ~]# ifconfig | grep "inet6" | head -n 1 | sed 's/^.*inet6 //g' | sed 's/ prefixlen.*$//g'
fe80::db97:e754:b016:1686 [root@localhost ~]# ifconfig | grep "RX packets" | head -n 1 | sed 's/^.*ets //g' | sed 's/ bytes.*$//g'
97265

Awk 文本报告生成器

awk是一种编程语言,用于在Linux下对文本和数据进行处理,数据可以来自标准输入(stdin),一个或多个文件,或其它命令的输出,它支持用户自定义函数和动态正则表达式等先进功能,此处我们只需要了解一些基础即可.

[root@localhost ~]# awk --help

命令语法:[ awk '条件1{动作1} 条件2{动作2} ....' 文件名 ]

条件:一般使用关系表达式作为条件
x>10 判断x变量是否大于10
x==y 判断变量x是否等于变量y
A ~ B 判断字符串A中是否包含能匹配B表达式的字符串
A!~ B 判断字符串A中是否不包含能匹配B表达式的字符串

在进行实验之前,首先创建lyshark.log测试文件,后续使用该文件练习过滤.

[root@localhost ~]# cat lyshark.log

ID      NAME    AGE     Gender  Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100

简单使用,awk格式化输出文本的第二列和第三列的内容.

[root@localhost ~]# awk '{ printf $2 "\t" $3 "\n" }' lyshark.log
NAME AGE
WR 22
LC 26
LY 23
XDL 40

指定分隔符,通过使用-F参数可以用于指定一个分隔符.

[root@localhost ~]# awk -F ":" '{printf $1 "\t" $6 "\n"}' /etc/passwd
root /root
bin /bin
daemon /sbin
adm /var/adm

Bengin/End关键字: BEGIN的执行时机是在awk程序开始过滤之前执行,BEGIN定义的动作只能被执行一次.

[root@localhost ~]# awk 'BEGIN{ printf "执行语句前,执行我 \n" }{ printf $2 "\t" $4 "\n" }' lyshark.log
执行语句前,执行我
NAME Gender
WR m
LC m
LY m
XDL b

至于END则刚好和BEGIN相反,END是在awk程序处理完所有数据,即将结束时执行,END后的动作只在程序结束时执行一次.

[root@localhost ~]# awk 'END{ printf "执行语句结束后,执行我 \n" }{ printf $2 "\t" $4 "\n" }' lyshark.log
NAME Gender
WR m
LC m
LY m
XDL b
执行语句结束后,执行我

当然了BEGIN与END是可以连用的,以下例子也就是实现了连用的效果.

[root@ ~]# awk 'BEGIN{ printf "执行语句前,先执行我 \n" }END{ printf "执行语句后,在执行我 \n"}{ printf $2 "\t" $4 "\n" }' lyshark.log

执行语句前,先执行我
NAME Gender
WR m
LC m
LY m
XDL b
执行语句后,在执行我

关系运算符: 设定条件,符合执行不符合不执行,下面设定条件为AGE字段>=25岁的列出

[root@localhost ~]# cat lyshark.log | grep -v ID | awk '$3 >=25 {print $1 "\t" $2}'
2 LC
4 XDL [root@localhost ~]# cat lyshark.log |grep -v ID | awk '$2 == "XDL" {print $0}'
4 XDL 40 b 100

awk正则匹配: awk是列提取命令,其每次读入一行,并进行判断,重复赋值变量,并打印数据.

指定搜索:正则搜索第2列NAME字段,包含XDL的行,并打印出AGE列对应的值.

[root@localhost ~]# cat lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100 [root@localhost ~]# awk '$2 ~/XDL/ {printf $3 "\n"}' lyshark.log
40

全局搜索:正则全局搜索包含WR的字段行,并打印本行$0全部数据.

[root@localhost ~]# cat lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100 [root@localhost ~]# cat lyshark.log | awk '/WR/ {printf $0 "\n"}'
1 WR 22 m 100

正则查找相应行:正则全局查找满足开头范围是[0-2]的行,并打印出全部数据.

[root@localhost ~]# cat lyshark.log
ID NAME AGE Gender Mark
1 WR 22 m 100
2 LC 26 m 90
3 LY 23 m 88
4 XDL 40 b 100 [root@localhost ~]# cat lyshark.log | awk '/^[0-2]/ {print $0}'
1 WR 22 m 100
2 LC 26 m 90

awk内置变量: 接下来将来看几个比较重要的内置变量的使用,以及简单实现判断功能

通过内置变量 FS=":" 定义分隔符,打印/etc/passwd文件的第1列和第7列

[root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk '{print $0}'
root:x:0:0:root:/root:/bin/bash [root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $7 "\n"}'
root /bin/bash

打印行内容的同时,打印出行号(NR变量),和本行的字段数(NF变量)

[root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN {FS=":"} {print $1 "\t" "行号:" NR "\t"}'
root 行号:1 [root@localhost ~]# cat /etc/passwd |grep "/bin/bash" | awk 'BEGIN {FS=":"} {print $1 "\t" "字段数:" NF "\t"}'
root 字段数:7 [root@localhost ~]# cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1 "\t" "记录数:" FNR "\t"}'
root 记录数:1
bin 记录数:2
daemon 记录数:3

打印内容的同时,首先判断 $1==sshd 然后再打印本行的行号等信息

[root@localhost ~]#  cat /etc/passwd | awk 'BEGIN{FS=":"}$1=="sshd" {print $0}'
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

简单判断功能:将第2行,到第4行,的内容加起来,最后输出结果相加的结果

[root@localhost ~]# cat lyshark.log
ID NAME AGE SEX LINUX
1 LY 18 boy 100
2 SC 30 man 150
3 WR 22 man 90
4 ZSX 55 boy 96 [root@localhost ~]# awk 'NR==2{x=$3} NR==3{y=$3} NR==4{z=$3} {totle=x+y+z;print "Totle is:" totle}' lyshark.log
Totle is:0
Totle is:18
Totle is:48
Totle is:70
Totle is:70 [root@localhost ~]# awk 'NR==2{x=$3} NR==3{y=$3} NR==4{z=$3;totle=x+y+z;print "Totle is:" totle}' lyshark.log
Totle is:70

简单判断功能:统计AGE列,将年龄小于25岁的任过滤出来,并显示 is young man!

[root@localhost ~]# cat lyshark.log
ID NAME AGE SEX LINUX
1 LY 18 boy 10
2 SC 30 man 50
3 WR 22 man 90
4 ZSX 55 boy 96 [root@localhost ~]# cat lyshark.log | awk '{if (NR >= 2){if ($3 < 25) printf $2 " IS Young Man! \n"}}'
LY IS Young Man!
WR IS Young Man!

简单判断功能:统计LINUX列,当出现大于80分的,打印到屏幕上 is good man!

[root@localhost ~]# cat lyshark.log
ID NAME AGE SEX LINUX
1 LY 18 boy 10
2 SC 30 man 50
3 WR 22 man 90
4 ZSX 55 boy 96 [root@localhost ~]# cat lyshark.log | awk 'NR>=2 {temp=$5} temp>80 {printf $2 "IS Good Man!\n"}'
WRIS Good Man!
ZSXIS Good Man!

Linux 文本处理三剑客应用的更多相关文章

  1. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  2. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  3. 关于Linux文本处理“三剑客”的一些小操作。

    Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...

  4. Linux文本处理三剑客之——grep

    一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...

  5. Linux 文本处理三剑客之grep

    文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...

  6. Linux文本处理三剑客之grep

    简介 grep命令,用于在一个文本文件中或者从STDIN中,根据用户给出的模式(pattern)过滤出所需要的信息. grep以及三剑客中的另外两个工具sed和awk都是基于行处理的,它们会一行行读入 ...

  7. linux文本处理三剑客之 grep

    文本处理无非是对文本内容做查看.修改等操作.Linux三剑客: grep.sed 和 awk 命令. 处理文本内容,用 Vim 编辑器不是很好吗?Vim 允许我们使用键盘.鼠标来对文本内容进行交互性地 ...

  8. linux文本处理三剑客的学习

    linux下有三个文本处理的神器.分别是grep,sed,awk.功能都是比较强大的. grep帮助: http://my-study-grep.readthedocs.io/en/latest/ s ...

  9. linux文本处理三剑客(一)---grep

    在linux种有一句话,叫做一切皆文件.文件有个特点,它是个文本.它可以读.可以写,如果是二进制文件,它还能执行.这样的话,我们在使用linux的时候,多数时间都是要和各式各样文件打交道的.那么,熟悉 ...

  10. 二、LINUX文本处理三剑客之grep

    1. grep一般格式:grep [选项] 基本正则表达式 [文件],其中基本正则表达式需要用引号引起来 引号引起来的作用:a.防止被误解为shell命令,b.可以用来查找多个单词组成的字符串 gre ...

随机推荐

  1. 用 Python 开发的 PDF 抽取Excel表格 2.0版

    前些天向大家介绍了我开发的从PDF抽取表格小工具的使用方法(️点击直达),有同学反馈说有一些问题: 一页PDF有多张表,只能抽取第一个 有些表格线条是透明的,无法抽取 一页一页处理太麻烦,不能一次性抽 ...

  2. 用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?

    在去年疫情期间,在线教育行业获得了井喷式的发展,这背后的技术功臣非 RTC 莫属.本文将分享 RTC 技术在音乐教育场景下的实践经验. 作者| 逸城 审校| 泰一 音乐教育场景 - 在线陪练 2020 ...

  3. GIL 锁或将在 CPython 中成为可选项

    哈喽大家好,我是咸鱼 几天前有媒体报道称,经过多次辩论,Python 指导委员会打算批准通过 PEP 703 提案,让 GIL(全局解释器)锁在 CPython 中成为一个可选项 PEP 703 提案 ...

  4. POJ - 1113 Wall (凸包模板) Graham Scan 算法实现

    Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall ...

  5. SpringCloud学习 系列十、服务熔断与降级(2-方法级别服务降级)

    系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...

  6. element-plus-admin学习笔记

    https://toscode.gitee.com/hsiangleev/element-plus-admin

  7. bitcask论文翻译/笔记

    翻译 论文来源:bitcask-intro.pdf (riak.com) 背景介绍 Bitcask的起源与Riak分布式数据库的历史紧密相连.在Riak的K/V集群中,每个节点都使用了可插拔的本地存储 ...

  8. 大四上 | 计算机综合课设(OS)· 答辩经验帖

    课设代码 repo 被问了如下问题: 我们的 OS 中是否有 idle 进程. 背景:如果所有进程都被 kill 掉了,那么 os 就会陷入死循环.即使再发生需要响应的事情,比如希望再创建个进程 或者 ...

  9. Java开发者的Golang进修指南:从0->1带你实现协程池

    在Java编程中,为了降低开销和优化程序的效率,我们常常使用线程池来管理线程的创建和销毁,并尽量复用已创建的对象.这样做不仅可以提高程序的运行效率,还能减少垃圾回收器对对象的回收次数. 在Golang ...

  10. 25-IP核简介

    1.IP IP(Intellectual Property)即知识产权,在半导体产业中讲IP核定义为用于"ASIC或FPGA中的预先设计好的电路功能模块".简言之,这里的IP即电路 ...