Linux 文 本 处 理 工 具
一.学习大纲:
◎各种文本工具来查看、分析、统计文本文件
文件内容查看工具:cat, tac,rev,more,less
文件截取:head和tail
按列抽取:cut,paste
分析文本的工具:wc , sort , uniq,diff和patch
命令使用练习题
◎文本过滤与处理工具:
grep与正则表达式
grep命令使用练习题
egrep与扩展正则表达式
erep命令使用练习题
Sed文件处理工具
※为什么要学习文件处理工具?
我们从以上几个方面来学习和认识在Linux中文本处理的工具,在linux中绝大多数的文件为文本工具,例如:centos中 单一的文本编辑工具nano,可以打开 /etc下有许多文件配置文件,还可以打开/var/log中的大多数的日志文件等等。
在我们日常linux维护工作中,我们会更许许多多的文本工具打交到,那我们日常对于日志文件的分析统计工作,对于配置文件的排查问题等等问题需要我们灵活的使用文本处理工具。
※由浅入深的学习各个文件工具的使用
我们由浅入深的一一了解各个文本处理工具的功效与用法,后面我们在配和实例来详细的了解各个工具的灵活使用。
§·文件内容查看工具:cat, tac,rev,more,less
cat,tac,rev命令:查看文件内容
功能:查看文件内容
语法:cat tac rev [FILE] ,屏幕上直接显示文件的内容。
参数:以cat命令为例讲解
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
more: 分页查看文件
功能:分页查看文件内容,对于大文件
语法:more [OPTIONS…] FILE…
参数:
-d: 显示翻页及退出提示
less命令是man命令使用的分页器
功能:less:一页一页地查看文件或STDIN输出
语法:less FILE…
参数:
/文本搜索文本
n/N跳到下一个or 上一个匹配
less命令是man命令使用的分页器
§·文件截取:head和tail
head命令:显示文件头前面指定多少行
语法:head [OPTION]… [FILE]…
参数:
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#:指定行数
tail命令:显示文件尾后面指定多少行
语法:tail [OPTION]… [FILE]…
参数:
-c #: 指定获取后#字节
-n #: 指定获取后#行
-#:
-f: 跟踪显示文件新追加的内容,常用日志监控
§·按列抽取文本cut和合并文件paste
Cut:抽取文件工具
语法:cut [OPTION]… [FILE]…
参数:
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6 混合使用:1-3,7
-c :按字符切割
–output-delimiter=STRING指定输出分隔符
Paste命令:合并两个文件同行号的列到一行
语法:paste [OPTION]… [FILE]…
参数:
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
例:paste f1 f2
paste -s f1 f2
§·分析文本的工具:wc , sort , uniq,diff和patch
Wc:文本数据统计工具
功能:
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
语法:wc [OPTION]… [FILE]…
参数:v
-l : 来只计数行数
-w : 来只计数单词总数
-c : 来只计数字节总数
-m : 来只计数字符总数
Sort:整理文本,按特定要求排序
功能:把整理过的文本显示在STDOUT,不改变原始文件
语法:sort [OPTION]… [FILE]…
参数:
Ü-r : 执行反方向(由上至下)整理
Ü-n : 执行按数字大小整理
Ü-f : 选项忽略(fold)字符串中的字符大小写
Ü-u : 选项(独特,unique)删除输出中的重复行
Ü-t c : 选项使用c做为字段界定符
Ü-k X : 选项按照使用c字符分隔的X列来整理能够使用多次
Uniq:从输入中删除重复的前后相接的行
功能:从输入中删除重复的前后相接的行
语法:uniq [OPTION]… [FILE]…
参数:
-c: 显示每行重复出现的次数;
-d: 仅显示重复过的行;
-u: 仅显示不曾重复的行;
连续且完全相同方为重复
v常和sort 命令一起配合使用:
sort userlist.txt | uniq-c
diff和patch:文件比较文件和补丁升级工具
功能:
v比较两个文件之间的区别
diff foo.conf-broken foo.conf-works
5c5
<use_widgets=no
—
>use_widgets=yes
Ø注明第5行有区别(改变)
v diff命令的输出被保存在一种叫做“补丁”的文件中,使用-u选项来输出“统一的(unified)”diff格式文 件,最适用于补丁文件。
vpatch命令复制在其它文件中进行的改变(要谨慎使用!)
Ø 适用-b选项来自动备份改变了的文件
diff -u foo.conf-broken foo.conf-works > foo.patch patch -b foo.conf-broken foo.patch
§·以上命令的使用练习:
v1、找出ifconfig命令结果中本机网卡eno16777736的IPv4地址?
·需要截取IP地址,我们得有命令显示出我们的额IP地址
[root@wCentos7 ~]# ifconfig eno16777736 #显示本机网卡的信息 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.1.16.70 netmask 255.0.0.0 broadcast 10.255.255.255 inet6 fe80::20c:29ff:fe90:ef7d prefixlen 64 scopeid 0x20<link> ether 00:0c:29:90:ef:7d txqueuelen 1000 (Ethernet) RX packets 1001183 bytes 99430689 (94.8 MiB) RX errors 0 dropped 93 overruns 0 frame 0 TX packets 69994 bytes 14596210 (13.9 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
·观察我们需要截取的ip地址位置,显示出我们需要的那 IP地址那一行
[root@wCentos7 ~]# ifconfig eno16777736 | head -n2 eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.1.16.70 netmask 255.0.0.0 broadcast 10.255.255.255 [root@wCentos7 ~]# ifconfig eno16777736 | head -n2 | tail -1 inet 10.1.16.70 netmask 255.0.0.0 broadcast 10.255.255.255
·找到需要截取的行,使用cut命名截取需要字段
[root@wCentos7 ~]# ifconfig eno16777736 | head -n2 | tail -1 | cut -c10-30 net 10.1.16.70 netma [root@wCentos7 ~]# ifconfig eno16777736 | head -n2 | tail -1 | cut -c14-30 10.1.16.70 netma [root@wCentos7 ~]# ifconfig eno16777736 | head -n2 | tail -1 | cut -c14-25 #找到截取字段 10.1.16.70
2、查出分区空间使用率的最大百分比值?
·查看分区利用率的命令df
[root@wCentos7 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 47G 3.7G 43G 8% / devtmpfs 475M 0 475M 0% /dev tmpfs 489M 88K 489M 1% /dev/shm tmpfs 489M 14M 476M 3% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda5 19G 42M 19G 1% /testdir /dev/sda1 187M 138M 49M 74% /boot tmpfs 98M 12K 98M 1% /run/user/0 tmpfs 98M 0 98M 0% /run/user/1003
·使用 tail 与head找出我们需要的行
[root@wCentos7 ~]# df -h | tail -3 /dev/sda1 187M 138M 49M 74% /boot tmpfs 98M 12K 98M 1% /run/user/0 tmpfs 98M 0 98M 0% /run/user/1003 [root@wCentos7 ~]# df -h | tail -3 | head -n1 /dev/sda1 187M 138M 49M 74% /boot
·通过cut命令截取出我们需要的数据
[root@wCentos7 ~]# df -h | tail -3 | head -n1 | cut -d" " -f15 74%
v3、查出用户UID最大值的用户名、UID及shell类型?
·我们先观察passwd文件,看看我们需要的字段有哪些,整理如下:使用 sort UID排序,再显示指定行,通过cut命令截取出我们相应的数据。
[root@wCentos7 ~]# cat /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 loveme11:x:3007:3007::: dbback11:x:3008:3008::: BACK11:x:3009:3009::: sb:x:5001:5001::/home/sb:/bin/bash love1:x:5001:5001:love1:/home/love1:/bin/bash love2:x:5002:5002:love2:/home/love2:/bin/bash love3:x:5003:5003:love3:/home/love3:/bin/bash love4:x:5004:5004:love4:/home/love4:/bin/bash love5:x:5005:5005:love5:/home/love5:/bin/bash love6:x:5006:5006:love6:/home/love6:/bin/bash user1:x:5007:5007::/home/user1:/bin/bash user2:x:5008:5008::/home/user2:/bin/bash user3:x:5009:5009::/home/user3:/bin/bash mage:x:5010:5010::/home/mage:/bin/bash wang:x:5011:5011::/home/wang:/bin/bash
·通过sort命令UID排序
[root@wCentos7 ~]# sort -t: -k3 -n /etc/passwd # -t : 指定分隔符为 “:” , -k : 以第三列排序(第三列为UID号),-n :以数字的小到大排序 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 gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin love3:x:5003:5003:love3:/home/love3:/bin/bash love4:x:5004:5004:love4:/home/love4:/bin/bash love5:x:5005:5005:love5:/home/love5:/bin/bash love6:x:5006:5006:love6:/home/love6:/bin/bash user1:x:5007:5007::/home/user1:/bin/bash user2:x:5008:5008::/home/user2:/bin/bash user3:x:5009:5009::/home/user3:/bin/bash mage:x:5010:5010::/home/mage:/bin/bash wang:x:5011:5011::/home/wang:/bin/bash nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
·找到最后一行为我们需要的数据行
[root@wCentos7 ~]# sort -t: -k3 -n /etc/passwd | tail -1 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
·通过CUT命令截取出我们需要显示的数据
[root@wCentos7 ~]# sort -t: -k3 -n /etc/passwd | tail -1 |cut -d: -f1,3,7 nfsnobody:65534:/sbin/nologin
4、查出/tmp的权限,以数字方式显示?
·分析需要,我们可以通过stat的命令获取到文件的数字权限,我们在来通过别的命令截取出需要的权限数字。
[root@wCentos7 /]# stat /tmp #可以显示文件的数字权限 1777 File: ‘/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 133 Links: 24 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:tmp_t:s0 Access: 2016-08-04 20:43:42.148513773 +0800 Modify: 2016-08-05 10:17:23.896929701 +0800 Change: 2016-08-05 10:17:23.896929701 +0800 Birth: - [root@wCentos7 /]# stat /tmp | head -n3 File: ‘/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: 802h/2050d Inode: 133 Links: 24
·找到我们需要的的数据行
[root@wCentos7 /]# stat /tmp | head -n4 |tail -n1 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
·通过cut命令截取出我们需要的数据
[root@wCentos7 /]# stat /tmp | head -n4 |tail -n1 |cut -d: -f2 (1777/drwxrwxrwt) Uid [root@wCentos7 /]# stat /tmp | head -n4 |tail -n1 |cut -d: -f2 | cut -d"/" -f1 (1777 [root@wCentos7 /]# stat /tmp | head -n4 |tail -n1 |cut -d: -f2 | cut -d"/" -f1 |cut -d"(" -f2 1777
§·grep与正则表达式
grep介绍
功能:
grep: Global search REgularexpression and Print out the line.
文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
语法:
grep [OPTIONS] PATTERN [FILE…]
grep root /etc/passwd
grep "$USER" /etc/passwd
grep '$USER' /etc/passwd
grep `whoami` /etc/passwd
参数:
v–color=auto: 对匹配到的文本着色显示;
v-v: 显示不能够被pattern匹配到的行;
v-i: 忽略字符大小写
v-n:显示匹配的行号
v-c: 统计匹配的行数
v-o: 仅显示匹配到的字符串;
v-q: 静默模式,不输出任何信息
v-A #:after, 后#行
v-B #: before, 前#行
v-C #:context, 前后各#行
v-e:实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
v-w:整行匹配整个单词
v-E:使用扩展正则表达式
正则表达式介绍:
功能:
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
程序支持:grep, vim, less,nginx等
分两类:
基本正则表达式:BRE
扩展正则表达式:ERE
grep -E, egrep (grep可以直接调用扩展正则表达式 )
正则表达式引擎:
采用不同算法,检查处理正则表达式的软件模块
PCRE(Perl Compatible Regular Expressions)
元字符分类:字符匹配、匹配次数、位置锚定、分组
man 7 regex (更多帮助详见)
基本正则表达式元字符
字符匹配:
. :匹配任意单个字符;
[] :匹配指定范围内的任意单个字符
[^] :匹配指定范围外的任意单个字符
[:digit:](所有数字)、[:lower:](所有小写字母)、[:upper:](所有大写字母)、[:alpha:](所有字母)、
[:alnum:](所有数字加字母)、[:punct:]、[:space:](空格和tab键)
匹配次数:
用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次,包括0次
贪婪模式:尽可能长的匹配
.*:任意长度的任意字符
\?:匹配其前面的字符0或1次
\+:匹配其前面的字符至少1次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
位置锚定:定位出现的位置
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$: 用于模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行
\< 或\b:词首锚定,用于单词模式的左侧
\> 或\b:词尾锚定;用于单词模式的右侧
\<PATTERN\>:匹配整个单词
分组及引用:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, … \1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
实例:\(string1\+\(string2\)*\)
\1: string1\+\(string2\)*
\2: string2
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
§·grep的使用练习:
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)?
·Ss的一定要记得是行首锚定
[root@wCentos7 /]# grep "^[sS]" /proc/meminfo SwapCached: 912 kB SwapTotal: 3905532 kB SwapFree: 3902664 kB Shmem: 11932 kB Slab: 120804 kB SReclaimable: 61400 kB SUnreclaim: 59404 kB
2、显示/etc/passwd文件中不以/bin/bash结尾的行?
·不以/bin/bash结尾的,-v 取反,相反意思就是:以/bin/bash结尾的行
[root@wCentos7 /]# grep "/bin/bash$" etc/passwd #显示passwd中以/bin/bash结尾的行,取反即可得到需求. root:x:0:0:root:/root:/bin/bash chen:x:1000:1000:chenjiashun,it,110,119:/home/ChenJiaShun:/bin/bash natasha:x:1003:1004::/home/natasha:/bin/bash harry:x:1004:1005::/home/harry:/bin/bash loveme:x:5000:5000::/root/:/bin/bash BACK:x:987:100::/home/BACK:/bin/bash chen11:x:3001:3001:chen11:/home/chen11:/bin/bash user11:x:3002:3002:user11:/home/user11:/bin/bash sb:x:5001:5001::/home/sb:/bin/bash love1:x:5001:5001:love1:/home/love1:/bin/bash love2:x:5002:5002:love2:/home/love2:/bin/bash love3:x:5003:5003:love3:/home/love3:/bin/bash love4:x:5004:5004:love4:/home/love4:/bin/bash love5:x:5005:5005:love5:/home/love5:/bin/bash love6:x:5006:5006:love6:/home/love6:/bin/bash user1:x:5007:5007::/home/user1:/bin/bash user2:x:5008:5008::/home/user2:/bin/bash user3:x:5009:5009::/home/user3:/bin/bash mage:x:5010:5010::/home/mage:/bin/bash wang:x:5011:5011::/home/wang:/bin/bash [root@wCentos7 /]# grep -v "/bin/bash$" etc/passwd
3、显示用户rpc默认的shell程序?
·分析需求:用户名在passwd中,rpc用户名应该出现在行首,并且rpc是一个独立的单词,我们在通过cut来截取出第7段即可。
[root@wCentos7 /]# grep " ^\brpc\b" /etc/passwd #注意行首锚定 词首次尾锚定 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin [root@wCentos7 /]# grep "^\brpc\b" /etc/passwd | cut -d: -f7 /sbin/nologin
4、找出/etc/passwd中的两位或三位数?
·分析需求:grep两位数查找为:\b[1-9][1-9]\b ;三位数 \b[1-9][1-9][1-9]\b 。
[root@wCentos7 /]# grep -o "\b[1-9]\{2,3\}\b" /etc/passwd (由于粘贴无法显示颜色区别,我就粘贴结果上来) 12 11 12 14 99 99 999 998 998 997 81 81 997 996 173 173 996 995 59 59 995 994 113
5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行?
[root@wCentos7 /]# grep "^[[:space:]].*[^[:space:]].*" /etc/grub2.cfg load_env set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true set default="${saved_entry}" menuentry_id_option="--id" menuentry_id_option="" set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true if [ -z "${boot_once}" ]; then saved_entry="${chosen}" save_env saved_entry fi if [ x$feature_all_video_module = xy ]; then insmod all_video else insmod efi_gop insmod efi_uga insmod ieee1275_fb insmod vbe insmod vga insmod video_bochs insmod video_cirrus fi set timeout_style=menu set timeout=5 set timeout=5 source ${prefix}/user.cfg if [ -n ${GRUB2_PASSWORD} ]; then set superusers="root" export superusers password_pbkdf2 root ${GRUB2_PASSWORD} fi load_video set gfxpayload=keep insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 9dec22f7-215e-4a47-97d1-ae09446d62d2 else search --no-floppy --fs-uuid --set=root 9dec22f7-215e-4a47-97d1-ae09446d62d2 fi linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=b63a2f0c-c9f9-465d-b2b5-3830fedccdd2 ro crashkernel=auto rhgb quiet.UTF-8 initrd16 /initramfs-3.10.0-327.el7.x86_64.img load_video insmod gzio insmod part_msdos insmod xfs set root='hd0,msdos1' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 9dec22f7-215e-4a47-97d1-ae09446d62d2 else search --no-floppy --fs-uuid --set=root 9dec22f7-215e-4a47-97d1-ae09446d62d2 fi linux16 /vmlinuz-0-rescue-2d34ee936fa14412ad51a08dcb36643d root=UUID=b63a2f0c-c9f9-465d-b2b5-3830fedccdd2 ro crashkernel=auto rhgb quiet initrd16 /initramfs-0-rescue-2d34ee936fa14412ad51a08dcb36643d.img source ${config_directory}/custom.cfg source $prefix/custom.cfg;
6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行?
[root@wCentos7 /]# netstat -tan | grep "LISTEN[[:space:]]*" tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN
7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行?
[root@wCentos7 /]# grep "^\(\b[[:alnum:]]\+\b\).*\1$" /etc/passwd # ^ \(\b[[:alnum:]]\+\b\) .*\1$ 红色部分为分组:意义为任意字母与数字开头且为单词的用户名; 中间 .* :中间可以出现任意字符; 后面 \1$ : 结尾为红色部分的内容(行尾也就是shell的的名称) sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt nologin:x:5015:5015::/home/nologin:/sbin/nologin
8、统计last命令,统计root用户连接的IP地址分类统计?
·分析需求:我们需要过滤出不是root用户的连接 ,排除没有IP地址的行。
[root@wCentos7 /]# last | grep "^\broot\b.*\b\([1-9]\+\.\)\b" # ^\broot\b :行首为root; \b \([1-9]\+\.\) \b : 数字出现1-9且可以多位数并且数字尾部还有 . 的行。 root pts/0 10.1.16.1 Fri Aug 5 08:58 still logged in root pts/1 10.1.16.1 Thu Aug 4 20:45 - 22:11 (01:26) root pts/1 10.1.16.1 Thu Aug 4 20:43 - 20:45 (00:02) root pts/1 10.1.16.1 Thu Aug 4 20:40 - 20:43 (00:02) root pts/1 10.1.16.1 Thu Aug 4 17:30 - 20:40 (03:10) root pts/0 10.1.16.1 Thu Aug 4 14:11 - 22:11 (08:00) root pts/1 10.1.16.1 Thu Aug 4 08:31 - 11:44 (03:12) root pts/1 10.1.16.1 Wed Aug 3 21:11 - 21:32 (00:20) root pts/1 10.1.16.1 Tue Aug 2 17:48 - 18:09 (00:21) root pts/0 10.1.16.1 Tue Aug 2 17:44 - 10:09 (1+16:25) root pts/2 10.1.16.1 Tue Aug 2 17:19 - 17:41 (00:21) root pts/0 10.1.16.1 Tue Aug 2 14:50 - 17:41 (02:50) root pts/1 10.1.16.1 Tue Aug 2 14:38 - 17:22 (02:43) root pts/0 10.1.16.1 Tue Aug 2 08:38 - 14:50 (06:11) root pts/4 10.1.16.1 Sun Jul 31 14:11 - 10:36 (1+20:25) root pts/3 10.1.16.1 Sun Jul 31 12:42 - 09:00 (1+20:17) root pts/2 10.1.16.1 Sun Jul 31 12:18 - 09:00 (1+20:41) root pts/1 10.1.16.1 Sun Jul 31 11:13 - 15:20 (04:06) root pts/0 10.1.16.1 Sun Jul 31 10:17 - 15:20 (05:03) root pts/0 10.1.16.1 Sun Jul 31 10:10 - 10:17 (00:06) root pts/0 10.1.16.1 Sat Jul 30 17:27 - 20:39 (03:11) root pts/1 10.1.16.1 Sat Jul 30 14:10 - 17:03 (02:52) root pts/0 10.1.16.1 Sat Jul 30 13:24 - 17:03 (03:38) root pts/1 10.1.16.1 Sat Jul 30 10:52 - 12:13 (01:20) root pts/1 10.1.16.1 Sat Jul 30 10:16 - 10:52 (00:35) root pts/0 10.1.16.1 Sat Jul 30 08:41 - 12:13 (03:31) root pts/1 10.1.16.1 Fri Jul 29 18:15 - 20:17 (02:01) root pts/1 10.1.16.1 Fri Jul 29 14:48 - 18:05 (03:16) root pts/2 10.1.16.1 Fri Jul 29 11:54 - 18:05 (06:10) root pts/1 10.1.16.1 Fri Jul 29 08:33 - 14:48 (06:14) root pts/1 10.1.16.1 Thu Jul 28 20:27 - 20:59 (00:31) root pts/2 10.1.16.1 Thu Jul 28 10:16 - 18:27 (08:10) root pts/1 10.1.16.1 Thu Jul 28 08:37 - 18:27 (09:49) root pts/0 10.1.16.1 Thu Jul 28 08:22 - crash (00:13) root pts/1 10.1.16.1 Wed Jul 27 22:54 - 23:52 (00:58) root pts/0 10.1.16.1 Wed Jul 27 22:51 - 23:52 (01:01) root pts/3 10.1.16.1 Wed Jul 27 10:09 - crash (22:27) root pts/2 10.1.16.1 Wed Jul 27 09:07 - 10:09 (01:01) root pts/1 10.1.16.1 Wed Jul 27 08:22 - 10:40 (02:18) root pts/0 10.1.16.1 Tue Jul 26 18:27 - 10:29 (16:02) root pts/0 10.1.16.1 Tue Jul 26 15:06 - 17:01 (01:54) root pts/0 10.1.16.1 Tue Jul 26 11:17 - down (03:47) root pts/0 10.1.16.1 Tue Jul 26 11:00 - crash (00:15) root pts/0 10.1.16.1 Tue Jul 26 10:51 - 11:00 (00:08) root pts/0 10.1.16.1 Fri Jul 22 16:04 - 19:30 (03:26) root pts/0 192.168.71.1 Fri Jul 22 14:52 - 15:52 (01:00) root pts/0 192.168.71.1 Fri Jul 22 14:43 - 14:52 (00:09) root pts/0 192.168.71.1 Fri Jul 22 14:40 - 14:43 (00:02) root pts/0 192.168.71.1 Fri Jul 22 14:38 - 14:40 (00:01) root pts/0 192.168.71.1 Fri Jul 22 14:27 - 14:29 (00:01) root pts/0 192.168.71.1 Fri Jul 22 14:23 - 14:24 (00:01) root pts/0 192.168.71.1 Fri Jul 22 14:20 - 14:22 (00:01) root pts/0 192.168.71.1 Fri Jul 22 14:15 - 14:19 (00:04) root pts/0 192.168.71.1 Fri Jul 22 14:03 - 14:14 (00:10) root pts/3 192.168.71.1 Fri Jul 22 13:57 - crash (00:04) root pts/2 192.168.71.1 Fri Jul 22 12:47 - crash (01:14) root pts/1 192.168.71.1 Fri Jul 22 08:30 - crash (05:31) root pts/1 192.168.71.1 Thu Jul 21 20:00 - 20:09 (00:09) root pts/0 192.168.71.1 Thu Jul 21 18:35 - down (13:37) root pts/0 192.168.71.1 Thu Jul 21 17:18 - 18:35 (01:17) root pts/0 192.168.71.1 Thu Jul 21 16:43 - 17:16 (00:32) root pts/0 192.168.71.1 Thu Jul 21 16:42 - 16:43 (00:01) root pts/0 192.168.71.1 Thu Jul 21 16:02 - 16:41 (00:39) root pts/1 192.168.71.1 Thu Jul 21 14:12 - 16:01 (01:49) root pts/1 192.168.71.1 Thu Jul 21 14:09 - 14:11 (00:02)
·截取出IP地址的那一列做统计即可
[root@wCentos7 /]# last | grep "^\broot\b.*\b\([1-9]\+\.\)\b"| cut -c22-35 |uniq -c 45 10.1.16.1 20 192.168.71.1
§·egrep与扩展正则表达式
egrep介绍
功能:
功能和grep的功能一样,就是egrep可以支持扩展的正则表达式,gerp通过-E参数也可以调用egrep。
v egrep= grep -E
语法:egrep[OPTIONS] PATTERN [FILE…]
参数:参数与grep相同,由于grep可以使用-E 直接调用egrep,所以参数是一样的
扩展正则表达式介绍
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定:
^ :行首
$ :行尾
\<, \b :语首
\>, \b :语尾
分组:
()
后向引用:
\1, \2, … v或者: a|b C|cat: C或cat (C|c)at:Cat或cat
§·egrep的使用练习:
1、显示当前系统root、mage或wang用户的UID和默认shell?
[root@wCentos7 ~]# egrep "^\b(root|mage|wang)\b" /etc/passwd | cut -d: -f1,3,7 #egrp的或表达式为 (a|b|c),用户名应该出现在行首,并且用户名应该词首词尾锚定 root:0:/bin/bash mage:5010:/bin/bash wang:5011:/bin/bash
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行?
[root@wCentos7 ~]# egrep "^\b[a-z|A-Z|\_].*\b\(" /etc/rc.d/init.d/functions #^\b[a-z|A-Z|\_].*\b\( 开始为:^ 词首锚定 红色部分为单词或_的行首行尾锚定 \( :为转义 ( checkpid() { __pids_var_run() { __pids_pidof() { daemon() { killproc() { pidfileofproc() { pidofproc() { status() { echo_success() { echo_failure() { echo_passed() { echo_warning() { update_boot_stage() { success() { failure() { passed() { warning() { action() { strstr() { is_ignored_file() { is_true() { is_false() { apply_sysctl() {
3、使用egrep取出/etc/rc.d/init.d/functions中其基名?
基名:functions,取出functions即可
4、使用egrep取出上面路径的目录名?
[root@wCentos7 ~]# echo "/etc/rc.d/init.d/functions"| egrep -o "^\/.*\/" /etc/rc.d/init.d/
5、统计以root身份登录的每个远程主机IP地址的登录次数?
[root@wCentos7 /]# last | grep "^\broot\b.*\b\([1-9]\+\.\)\b"| cut -c22-35 |uniq -c 45 10.1.16.1 20 192.168.71.1
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255?
#一定记得要词首词尾锚定0-9 : egrep "\b[0-9]\b"10-99 : egrep "\b[1-9][0-9]\b" num1 100-199 : egrep "\b[1-9][0-9][0-9]\b" num1 200-249 : egrep "\b2[0-4][0-9]\b" num1 250-255 : egrep "\b25[0-5]\b" num1
7、显示ifconfig命令结果中所有IPv4地址?
[root@wCentos7 ~]# ifconfig | egrep -o "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)\. #取出数字为1-254后面加上一个 . 号 (\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)\. #取出数字为1-254后面加上一个 . 号 (\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)\. #取出数字为1-254后面加上一个 . 号 (\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)" #取出数字为1-254后面加上一个 . 号 10.1.16.70 192.168.122.1 [root@wCentos7 ~]#
§·Sed文件处理工具(下期更新)
原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/29579