Linux 文 本 处 理 工 具

Linux 文 本 处 理 工 具

一.学习大纲:

各种文本工具来查看、分析、统计文本文件

文件内容查看工具:cat, tac,revmoreless

文件截取:headtail

按列抽取:cutpaste

分析文本的工具:wc , sort , uniqdiffpatch

命令使用练习题

◎文本过滤与处理工具:

grep与正则表达式

grep命令使用练习题

egrep与扩展正则表达式

erep命令使用练习题

Sed文件处理工具 

为什么要学习文件处理工具?

我们从以上几个方面来学习和认识在Linux中文本处理的工具,在linux中绝大多数的文件为文本工具,例如:centos中 单一的文本编辑工具nano,可以打开 /etc下有许多文件配置文件,还可以打开/var/log中的大多数的日志文件等等。

在我们日常linux维护工作中,我们会更许许多多的文本工具打交到,那我们日常对于日志文件的分析统计工作,对于配置文件的排查问题等等问题需要我们灵活的使用文本处理工具。

由浅入深的学习各个文件工具的使用

我们由浅入深的一一了解各个文本处理工具的功效与用法,后面我们在配和实例来详细的了解各个工具的灵活使用。

§·文件内容查看工具:cat, tac,revmoreless

cattacrev命令:查看文件内容

功能:查看文件内容

语法: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命令使用的分页器

§·文件截取:headtail

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 , uniqdiffpatch

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 

diffpatch:文件比较文件和补丁升级工具

功能:

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命令结果中本机网卡eno16777736IPv4地址

·需要截取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最大值的用户名、UIDshell类型?

·我们先观察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 dogfile

v-w:整行匹配整个单词

v-E:使用扩展正则表达式

正则表达式介绍:

功能:

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

程序支持:grep, vim, less,nginx

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep -E, egrep grep可以直接调用扩展正则表达式 )

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

PCREPerl Compatible Regular Expressions

元字符分类:字符匹配、匹配次数、位置锚定、分组

man 7 regex (更多帮助详见)

基本正则表达式元字符

字符匹配:

 . :匹配任意单个字符;

[] :匹配指定范围内的任意单个字符

[^] :匹配指定范围外的任意单个字符

[:digit:](所有数字)、[:lower:](所有小写字母)、[:upper:](所有大写字母)、[:alpha:](所有字母)、

[:alnum:](所有数字加字母)、[:punct:][:space:](空格和tab键) 

匹配次数:

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

*:匹配前面的字符任意次,包括0

贪婪模式:尽可能长的匹配

.*:任意长度的任意字符

\?:匹配其前面的字符01

\+:匹配其前面的字符至少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'后跟01或多个空白字符结尾的行?

[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、添加用户bashtestbashbasher以及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,所以参数是一样的 

扩展正则表达式介绍

字符匹配:

. 任意单个字符

[] 指定范围的字符

[^] 不在指定范围的字符

次数匹配:

*:匹配前面字符任意次

?: 01

+1次或多次

{m}:匹配m

{m,n}:至少m,至多n

位置锚定:

^ :行首

$ :行尾

\<, \b :语首

\>, \b :语尾

分组:

()

后向引用:

\1, \2, …  v或者:  a|b    C|cat: Ccat     (C|c)at:Catcat

§·egrep的使用练习:

1、显示当前系统rootmagewang用户的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-910-99100-199200-249250-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