【Linux】(17)文本处理命令:grep+wc+diff+bc+awk+多进程

目录

一、grep

        1.1【选项】-i

        1.2【选项】-n

        1.3【选项】-o

        1.4【选项】-v

        1.5【选项】-r

        1.6【模式】^ 和 $

        1.7【选项】-E

        1.7.1 正则表达式

        1.7.2 单词界定符号

         1.8【选项】-A

        1.9【选项】-B

        1.10【选项】-C

        1.11【选项】-w

二、wc

        2.1 选项

三、diff

        3.1 diff输出内容解释

        3.2 将文件备份,一段时间后,如何判断文件是否被修改

        3.3 补丁

        3.3.1 生成补丁

        3.3.2 打补丁

四、补充命令【练习】

        5.1 bc

        5.1.1 输出值和返回值

        5.1.2 bc的两种使用方式

        5.1.3 bc的输出值和返回值

        5.1.4 将输出的内容赋值给变量

        5.2 [ ]

         5.2.1 -eq

        5.2.2 -gt

        5.2.3 -lt

        5.2.4 -ge

        5.2.5 -le

        5.2.6 -ne

        5.3 awk

        5.3.1 awk命令的简要处理流程

         5.3.2 awk的数据字段变量和-F选​项

        5.3.3 awk命令的完整语法

        5.3.4 NR和NF

        5.4 多进程思想

        5.4.1 父进程和子进程的问题


一、grep

Linux工具程序,可做文件内的字符串查找

到文件里去匹配字符串,然后将匹配的行显示出来,输出到屏幕上。

grep在匹配字符串时,为模糊匹配

模式:一些条件的组合,主要是一些字符串+数字+特殊符号,组成一个模式(或:表达式),用于表达某个意思

        【举例】^root|^liu 就是一个模式:以root开头或者以liu开头

元字符:有特殊作用的符号==》描述其他字符。如:

        1. ^ 表示以什么开头。如:^root 表示以root开头

        2. | 或者

        3. $

[root@localhost ~]# cat /etc/passwd | grep "^root"
root:x:0:0:root:/root:/bin/bash

        1.1【选项】-i

忽略大小写

[root@localhost 0326]# cat phone.txt 
xiaomi
XIAOMI
huawei
HUAWEI
oppo
 OPPO
 vivo
VIVO
meizu
MEIZU
[root@localhost 0326]# cat phone.txt |grep -i huawei
huawei
HUAWEI
[root@localhost 0326]# cat phone.txt |grep  huawei
huawei

        1.2【选项】-n

显示筛选出的行号

[root@localhost 0326]# cat phone.txt |grep -i -n huawei
3:huawei
4:HUAWEI

        1.3【选项】-o

只显示匹配的内容

[root@localhost 0326]# cat phone.txt |grep oppo
oppo OPPO vivo
[root@localhost 0326]# cat phone.txt |grep -o oppo
oppo

        1.4【选项】-v

反转查找,显示与模式不相匹配的行 ==》取反 invert

[root@localhost 0326]# cat phone.txt |grep -v xiaomi
XIAOMI
huawei
HUAWEI
oppo OPPO vivo
VIVO
meizu
MEIZU

        1.5【选项】-r

递归搜索所有的文件

查找某个目录下所有的文件,然后去匹配字符串

[root@localhost ~]# grep -r "xiaomi" ./*  ==》递归查找出当前目录下所有的文件里含有xiaomi的全部行
./lianxi/0326/phone.txt:xiaomi
./lihua.txt:xiaoming
[root@localhost ~]# grep -r "xiaomi" .    ==》不接*也可以
./lianxi/0326/phone.txt:xiaomi
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./.bash_history:bash position.sh lihua lihong xiaomei hanmeimei xiaoming fanyouyou fengtingting
./lihua.txt:xiaoming
./.viminfo::%s /redmi/xiaomi/gc
./.viminfo::%s /xiaomi/redmi/g
./.viminfo::%s xiaomi/redmin/g
./.viminfo::5,7 s /xiaomi/redmi/g
./.viminfo::s 5,7/xiaomi/redmi/g
./.viminfo::s 5,7 /xiaomi/redmi/g
./.viminfo::s /xiaomi/redmi/g
./.viminfo::s /xiaomi/redmi
./.viminfo:? xiaomi

        1.6【模式】^ 和 $

1. ^…… 以……开头

2. ……$ 以……结尾

3. ^ 在中括号里表示取反 ==》【举例】 [^rmf] 表示不是 r 或 m 或 f 的字符

                这个方法和-v的选择:在具体的要求下,看哪个效果更好。

        在中括号外表示以什么开头 ==》【举例】^[rmf]表示以 r 或 m 或 f 开头的字符

4. ^$ 表示空行(行内没有内容)

[root@localhost 0326]# cat passwd |grep "^root"  ==》查找以root开头的行
root:x:0:0:root:/root:/bin/bash
[root@localhost 0326]# cat passwd |grep "bash$"  ==》查找以bash结尾的行
root:x:0:0:root:/root:/bin/bash
fzt:x:1000:1000::/home/fzt:/bin/bash
[root@localhost 0326]# cat /etc/passwd| grep "lihua[0-9][0-9][0-9]"
lihua321:x:1012:1012::/home/lihua321:/bin/bash
lihua100:x:1014:1014::/home/lihua100:/bin/bash

        1. 找到含有lihua并后面接了三个数字的行

[root@localhost 0326]# cat /etc/passwd| grep "lihua[0-9][0-9][0-9]"
lihua321:x:1012:1012::/home/lihua321:/bin/bash
lihua100:x:1014:1014::/home/lihua100:/bin/bash

        2. 找到空行

[root@localhost 0326]# cat white.txt 
hello

lihua
[root@localhost 0326]# cat white.txt |grep -n "^$"
2:

        3. 找到有效行

有效行:不是注释行,不是空行

[root@localhost 0326]# cat /etc/ssh/sshd_config |egrep -v "^#|^$"
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

        1.7【选项】-E

egrep grep -E 等价

支持扩展正则==》支持更多的元字符

        找到以root或者以li开头的行

[root@localhost 0326]# cat passwd |grep "^root|^li"
[root@localhost 0326]# cat passwd |grep -E "^root|^li"
root:x:0:0:root:/root:/bin/bash
lilanqing:x:1001:1001::/home/lilanqing:/bin/bash
lihua:x:1008:1008::/home/lihua:/bin/bash
liangluyao:x:1010:1010::/home/liangluyao:/bin/bash
lihua321:x:1012:1012::/home/lihua321:/bin/bash

        1.7.1 正则表达式

是由字符串+数字+特殊符号,按照正确的规则组合而成的,用来表达某个意思的公式。

基本正则:包含很多常见的正则,如 ^ $ [0-9] [a-z] ^$

扩展正则:在基本正则的基础上新加了很多新的元字符,如 |(或者) + { } ?

        【举例】cat passwd |grep -E "^root|^li"

        【解释】如果不加 -E 那就会将|识别为普通字符串,无法获取他的特殊含义。

.* 在正则里表示任意字符

. 任意单个字符

\. 表示点(\用于转义)

xy{n} 表示xyyyyy……(y连续出现n次)

        xy{2} 表示xyy

[x]{n} 表示x中的内容连续出现n次

        [0-9]{2} 表示从0到9中取两次数字,任意取哪个数字

        [0-9]{1,5} 表示从0到9中取2次到5次,任意取哪个数字,至少2次,至多5次

        [0-9]{2,} 表示表示从0到9中取2次以上,至少两次

        1.7.2 单词界定符号

\< 单词以什么开头

\> 单词以什么结尾

\b 可以取代\< 和 \>

         1.8【选项】-A

显示匹配内容所在行,及其后面行 after

[root@localhost 0326]# cat phone.txt |grep -A 2 huawei
huawei
HUAWEI
oppo OPPO vivo

        1.9【选项】-B

显示匹配内容所在行,及其前面行 before

[root@localhost 0326]# cat phone.txt |grep -B 2 huawei
xiaomi
XIAOMI
huawei

        1.10【选项】-C

显示匹配内容所在行,及其前面行和后面行

[root@localhost 0326]# cat phone.txt |grep -C 2 huawei
xiaomi
XIAOMI
huawei
HUAWEI
oppo OPPO vivo

        1.11【选项】-w

单词界定

-w, --word-regexp

        Select only those lines containing matches that form whole words.

【举例】egrep -w "[a-Z]{16}" 等价于 egrep "\b[a-Z]{16}\b"

二、wc

用来统计一个文件里有多少行,多少单词,多少字节数

[root@localhost 0328]# cat phone.txt |wc
     14      22     192
[root@localhost 0328]# wc <  phone.txt 
 14  22 192
 [root@localhost 0328]# wc   phone.txt 
 14  22 192 phone.txt
 [root@localhost 0328]# wc  -l phone.txt 
14 phone.txt
[root@localhost 0328]# cat phone.txt |wc -l   ==》一般都会选择和管道配合使用,因为这样不会显示文件名
14

        2.1 选项

-c (count)统计字节数

-l (lines)统计行

-w(world)统计单词数

三、diff

        比较两个文件之间的差异,输出结果为两个文件的不同之处

        当没有输出内容时,表示两个文件相同,该条命令的返回值为0.当有不同时,返回值为非0

        【选项】

-u 将不同的地方放在一起,紧凑易读

-r 递归比较目录下的所有文件

[root@localhost 0328]# cp /etc/passwd .
[root@localhost 0328]# cp /etc/passwd passwd.backup
[root@localhost 0328]# vim passwd
[root@localhost 0328]# diff passwd passwd.backup 
6d5
< lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin   ==》< 表示这是左边文件比右边文件多的内容
9,11d7
< 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
[root@localhost 0328]# cp phone.txt phone.backup
[root@localhost 0328]# diff phone.txt phone.backup    ==》没有输出表示两个文件相同,此时返回值为0
[root@localhost 0328]# 

        3.1 diff输出内容解释

[root@localhost 0328]# diff phone.txt phone.backup  ==》此时,phone.txt和phne.backup只修改了一个单词
1c1
< haxiaomi
---
> xiaomi
[root@localhost 0328]# diff -u phone.txt phone.backup 
--- phone.txt	2022-03-28 06:58:44.827437137 +0800   ==》-  表示左边文件
+++ phone.backup	2022-03-28 06:49:18.638186797 +0800   ==》+  表示右边文件
@@ -1,4 +1,4 @@   ==》表示左边文件1到4行和右边文件1到4行有差异
-haxiaomi   ==》具体差异为:左边文件是haxiaomi,右边文件为xiaomi
+xiaomi
 XIAOMI
 huawei
 HUAWEI

        3.2 将文件备份,一段时间后,如何判断文件是否被修改

  1. diff
  2. 查看访问时间(stat)
  3. md5sum:根据文件里的内容,计算md5值。如果文件被修改,那md5值将会发生改变。md5值不同,则文件不同
[root@localhost 0328]# md5sum passwd
8dde3c7ce53d5b82ecd90692081eb954  passwd
[root@localhost 0328]# md5sum passwd.backup 
f0af5d20dfadf7dfcf426b38d35e75cb  passwd.backup
[root@localhost 0328]# md5sum phone.txt 
89fe5a9475bc82530515cd7a8bfd5a75  phone.txt
[root@localhost 0328]# md5sum phone.backup 
89fe5a9475bc82530515cd7a8bfd5a75  phone.backup

        3.3 补丁

程序更新了部分。

发现漏洞后,需要编写弥补这个漏洞的程序。这个弥补漏洞的程序就是补丁。

        3.3.1 生成补丁

将test_v2.sh和test.sh的差异重定向到一个文件里,这个文件就是补丁文件

[root@localhost 0324]# cp test.sh test_v2.sh
[root@localhost 0324]# vim test_v2.sh 
[root@localhost 0324]# diff test.sh test_v2.sh 
4a5
>         echo "好久不见"

[root@localhost 0324]# diff test.sh test_v2.sh >test.patch  ==》生成补丁包
[root@localhost 0324]# ls
test.patch

        3.3.2 打补丁

安装patch

[root@localhost 0324]# yum install patch  -y
[root@localhost 0324]# patch test.sh < test.patch  ==》将补丁包test.patch打到teset.sh文件
patching file test.sh
[root@localhost 0324]# diff test.sh test_v2.sh ==》对比发现是否还有差异,发现没有了
[root@localhost 0324]#

四、补充命令【练习】

        5.1 bc

        是Linux里的计算器,支持小数和整数运算

        运算)可以进行整数之间的运算,小数之间的运算,以及整数和小数的混合运算(除了比较比较运算)

        【注】双圆括号(())只能进行整数运算

        5.1.1 输出值和返回值

输出的值:程序运行的过程中的输出内容而已

返回值:命令执行是否成功

        函数返回值:return ==》默认返回值是0

        脚本返回值:exit ==》用于退出脚本,后面不接数字,默认返回值是0

 

        5.1.2 bc的两种使用方式

==通过管道

[root@localhost 0328]# echo 4.3 + 62.5 |bc
66.8

==直接使用,输入quit退出

[root@localhost 0328]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
8.2+6.1
14.3
quit

        5.1.3 bc的输出值和返回值

两个数字不论谁打谁小,bc都进行了计算,所以命令返回值为0,表示命令执行成功

echo出来的值为表达式的执行结果,1表示该表达式正确,0表示该表达式错误

[root@localhost 0328]# echo "11.1 > 10.2" |bc
1
[root@localhost 0328]# echo $?
0
[root@localhost 0328]# echo "1.1 > 10.2" |bc
0
[root@localhost 0328]# echo $?
0

        5.1.4 将输出的内容赋值给变量

===方法一:使用反引号

[root@localhost 0328]# num=`echo "1.1 + 10" |bc`

[root@localhost 0328]# echo $num
11.1

===【推荐】方法二:使用 $()

[root@localhost 0328]# num1=$(echo "1.1 + 10" |bc)
[root@localhost 0328]# echo $num1
11.1

        5.2 [ ]

         5.2.1 -eq

equal 相等

判断两个整数是否相等

[root@localhost 0328]# [ 3 -eq 3 ]
[root@localhost 0328]# echo $?
0
[root@localhost 0328]# [ 3 -eq 30 ]
[root@localhost 0328]# echo $?
1

        5.2.2 -gt

great than 大于

        5.2.3 -lt

less than 小于

        5.2.4 -ge

大于等于

        5.2.5 -le

小于等于

        5.2.6 -ne

不等于

        5.3 awk

也可以实现小数计算,是文本处理的命令。

和sed一样,是一行一行的读取、处理。

sed作用于一整行的处理,而awk将一行分成数个字段来处理。

        5.3.1 awk命令的简要处理流程

         5.3.2 awk的数据字段变量和-F选

        5.3.3 awk命令的完整语法

BEGIN和END部分只是执行一次

中间部分每一行都执行一次

 

 【举例】

[root@localhost ~]# awk -F: 'BEGIN{print "####start#####"} $3>1000 {print $1,$3,$7} END{print "####end#########"}' /etc/passwd
####start#####
lilanqing 1001 /bin/bash
feng 1002 /bin/bash
lihua100 1014 /bin/bash
####end#########
[root@localhost ~]# awk 'BEGIN{print 49 - 23.4}'
25.6

%.2f\n 指定awk计算的进度,小数点后两位

[root@localhost ~]# a=30

[root@localhost ~]# b=10
[root@localhost ~]# awk 'BEGIN{printf "%.2f\n",'$a'/'$b'}'
3.00

        5.3.4 NR和NF

NR 是awk里表示每行的行号 number of record 记录的行号,一行就是一条记录

NF 是awk里表示一行有多少个字段数 number of fired

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819         228        1052          97         538        1328
Swap:          2047           0        2047
[root@localhost ~]# free -m|awk 'NR==2{print $3/$2}'
0.125344

        5.4 多进程思想

串行:一个一个一次执行,速度慢

并行:同时执行,速度快(多进程)

(命令)& 在后台产生子bash进程去执行命令,放到后台执行 ==》{命令}&同功能

        5.4.1 父进程和子进程的问题

当父进程结束时,会给发出信号,告诉内核杀死所有子进程

【解决】

        使用wait,父进程等待所有子进程执行完后再退出,防止父进程比子进程提前执行完,然后杀死了所有子进程,导致子进程没有执行完成。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值