magedu_20160804

文本处理工具和grep过滤工具以及正则表达式 

  一.文本处理工具相关命令

   前面课程中曾经使用过cat,head,tail命令查看相关文件,head,tail分别查看文件开头、结尾的行信息。对于特定想要显示的信息则需要特定的文本查看指令,比如cut,sort,paste,uniq等。如下内容分别对每个命令进行分别总结。


    1.more与less,head与tail

    more与less作用等同于cat文本查看命令,more命令默认按页面展示文件内容,常用-d选项显示翻页与退出提示。more命令显示文本界面只支持向后翻页而不支持向前翻页。less命令可查看文件与stdin输出,前后皆可翻页。

    head命令常用选项为-c与-n,-c显示文件前#个字节,-n显示文件前#行内容。tail命令与之相反,同样使用-c,-n选项,不同的是显示的是后#字节与后#行内容。对于如/etc/passwd这样的配置文件,如果要实现跟踪显示新追加内容,常常使用tail -f选项。此选项常用于log日志监控。


    2.cut与paste

    cut字面意思为剪切,用于选取文件特定纵列的内容。常常使用-c(按字符),-b(按字节)选取纵列。但在实际应用中,人很难按字符与字节详细查询指定纵列,所以这里详细讲解-d的使用方式如下:

[root@localhost ~]# cut -d: -f1,3 /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4

    上述命令-d:定义“:”为分隔符将文件分为若干纵列,-f1,3表示选取-d:定义的第1,3列。/etc/passwd以“:”分割内容的第1,3列内容为用户名称与UID号码,输出命令即为上面输出形式。

    在/etc/passwd这种内容格式固定的文件可以使用如同“:”作为分隔符。但如果文本内容不是固定格式,如果想要得到固定列内容,则需要自定义分隔符,可多次如下:

[root@localhost testdir]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.252.255  netmask 255.255.0.0  broadcast 10.1.255.255
        inet6 fe80::20c:29ff:fe61:2a16  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:61:2a:16  txqueuelen 1000  (Ethernet)
        RX packets 116344  bytes 11590351 (11.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4379  bytes 489447 (477.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 6  bytes 504 (504.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 504 (504.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:21:74:43  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

如果想通过cut命令只显示ip地址,则可以按照如下方式获得:

[root@localhost testdir]# ifconfig|tr -s ' '|grep 255|cut -d" " -f3
10.1.252.255
127.0.0.1
192.168.122.1

    由于ifconfig得到的信息排布凌乱,先使tr命令删除连续重复的空格字符,这样便于在随后的cut命令中使用空格作为分隔符选取纵列。

    paste命令用于合并两文件同行号内容排到一行并且使用分隔符隔开,-d选项定义两文件内容同行分隔符,举例如下:

[root@localhost testdir]# cat f1
xxx
xx
x
[root@localhost testdir]# cat f2

yyy
yy
y
[root@localhost testdir]# paste -d~ f1 f2
xxx~
xx~yyy
x~yy
~y


    3.wc与sort

    wc是分析文本数据的指令,也可以分析指定字符串。例如:

[root@localhost testdir]# wc /testdir/xiaojiji 
  52   96 2664 /testdir/xiaojiji

    这里52代表xiaojiji文件行数,96代表单词数,2664代表文件字符数。如果wc命令使用选项,有4种常用选项,其分别为:

    -l:只计数文本内容行数

    -w:只计数文本内容单词总数

    -c:只计数文本内容字节总数

    -m:只计数文本内容字符总数

    sort命令用于整理文本内容,以特殊排列的方式展示纵向文本,常常与cut一起使用。其命令选项为:

    -r:反向整理

    -n:按数字大小整理(由小到大

    -f:忽略字符大小写

    -u:删除输出中的重复行

    与cut命令一样,对于纵列的整理需要分隔符分割后定义列号,这时需要-t,-k的配合使用:

    示例:按照UID大小顺序排列/etc/passwd文件内容

[root@localhost ~]# sort -nt: -k3 /etc/passwd
...........
........
wangcai:x:1102:3001::/testdir/homewangcai:/bin/bash
alice:x:1103:3004::/home/alice:/bin/bash
tom:x:1104:3005::/home/tom:/bin/bash
bash:x:1105:1105::/home/bash:/bin/bash
testbash:x:1106:1106::/home/testbash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

    由此得到输出结果为UID从小到大的排列。

    

    4.uniq与diff

    uniq命令:从输入中删除重复内容的连续行,常常通过管道和sort整理后的结果使用。diff命令:对比两个文件内容,由于使用较少,这里不做详细介绍。


  二.grep以及正则表达式

    对于文本中特定字符或字符段的显示,无论是cat,cut,tail等命令都是难以做到的,这时就要使用grep文本搜索工具。grep命令常用于显示用户所需要的固定字段内容,对于范围内的固定字段,需要根据规定的正则表达式来体现。

    1.grep常用选项

    -v:显示没有被匹配的行,也就是取反

    -i:忽略匹配字符字母大小写

    -n:显示匹配字段行号

    -o:仅显示匹配到的字符

    -q:静默模式,不输出任何信息

    -A#:匹配字符与后#行

    -B#:匹配字符与前#行

    -C#:匹配字符与前后#行

    -w:匹配整个单词

    –color=auto:匹配字符上色


    2.正则表达式与扩展正则表达式

    正则表达式BRE的存在为grep查找范围字符段提供了方便灵活的使用手段。这里我把其分为四类用途如下:

    a.匹配单个字符表达方式

    .:匹配任意单个字符

    []:匹配任意[]范围内的单个字符,比如[1-9]代表匹配1-9以内的任意一个数字

    [^]:匹配任意非[]内的单个字符

    其他代表任意单个字符的正则表达式与之前讲到的通配符glob相似:[:digit:]任意单个数字,[:lower:]任意单个小写字母,[:upper:]任意单个大写字母,[:alpha:]任意单个字母,[:alnum:]任意单个数字或字母,[:space:]任意单个空白字符或tab字符,[:punct:]任意单个标点符号

    b.字符的匹配次数

    *:匹配前面字符的次数,比如.*代表匹配任意长度的任意字符

    \+:\表示转译符号,\+代表匹配前面字符0次或1次(\转译符在grep中很常见)

    \(m\):匹配前面字符m次

    \(m,n\):匹配前面字符最少m次,最多n次

    \(m,\):匹配前面字符至少m次

    \(,n\):匹配前面字符最多n次

    c.位置锚定

    ^:指定行首,比如^w表示匹配以w为开始的字符串

    $:指定行尾,w$表示匹配以w结尾的字符串

    ^$:匹配空行(行首行尾无字符)

    ^pattern$:匹配整行固定内容

    \<pattern\>:单词匹配模式,比如如果文本内容有mcgee,wangmcgee,我们仅仅想找寻mcgee,需要使用grep \<mcgee\>来查找,这里可以使用grep -w mcgee代替,但是如果查找范围内的单词,则必须使用\<pattern\>的用法了,这里\<pattern\>也可以使用\bpattern\b代替,但由于\b容易与单词混淆,个人不建议使用。

    d.分组与变量

    \(\):表示将()内的内容分组并记录在变量中,\仍然代表转译符。变量表示方式为\1,\2,\3….,这里\1表示第一个“\(”与其匹配的“\)”之间的内容,\2表示第二对,以此类推…。下面使用实例说明这四类用途:

    找出/etc/passwd文件中用户名与shell名称相同的行并显示

[root@localhost ~]# grep "^\(\<[[:alpha:]]\+\>\).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1105:1105::/home/bash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin

   这里使用了匹配字符表达方式,匹配字符次数,位置锚定,分组的所有用法,注意转译符号“\”的存在,如果理解上述abcd的用法,此例不难理解。


    2.扩展正则表达式

    扩展正则表达式ERE由egrep命令使用,egrep=grep -E。ERE区别于BRE即为匹配字符时“\”转译符的不使用,举例如下:

    查询/etc/passwd文件中UID或GID超过3位数的用户行:

[root@localhost ~]# grep -E "[0-9]{3,}" /etc/passwd
....
...
geoclue:x:994:991:User for geoclue:/var/lib/geoclue:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
setroubleshoot:x:992:989::/var/lib/setroubleshoot:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
saslauth:x:991:76:Saslauthd user:/run/saslauthd:/sbin/nologin
libstoragemgmt:x:990:988:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
mcgee:x:1000:1000:mcgeewang:/home/mcgeewang:/bin/bash
docker:x:1002:1002::/home/docker:/bin/bash
natasha:x:0:1004::/home/natasha:/bin/bash
harry:x:1004:1005::/home/harry:/bin/bash
gentoo:x:1005:1006::/testdir/gentoo:/bin/bash
user1:x:1100:1102:dafeige:/home:/bin/bash
user2:x:1101:1101:dafeige:/home:/bin/bash
wangcai:x:1102:3001::/testdir/homewangcai:/bin/bash
alice:x:1103:3004::/home/alice:/bin/bash
tom:x:1104:3005::/home/tom:/bin/bash
bash:x:1105:1105::/home/bash:/bin/bash
testbash:x:1106:1106::/home/testbash:/bin/bash
nologin:x:1107:1107::/home/nologin:nologin

   如上所示,得到三位数UID或GID的用户行信息。

原创文章,作者:mcgeewang,如若转载,请注明出处:http://www.178linux.com/29492

(0)
mcgeewangmcgeewang
上一篇 2016-08-08
下一篇 2016-08-08

相关推荐

  • Linux文件压缩、解压、归档总结

    一、简介   压缩对我们来说通常意味着减小文件体积,节省硬盘空间。在Windows平台上处理大文件或目录中的文件很多时我们都需要对这些文件进行压缩处理,压缩格式多种多样,如:zip、rar、7z等格式,压缩方式也比较多样话,支持按最大压缩比例或者最快时间进行压缩等多种方式,而生成的压缩包就可以让我们更方便的进行拷贝及归档整理。解压缩顾名思义就是回归…

    Linux干货 2015-09-26
  • N25-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;~]#fdisk -l #查看已有分区 设备 Boot Start End Blocks Id System/dev/sda1 * 2048 8194047 4096000 83 Linux/dev/sda2 8194048 24578047 8192000 82 Linux swap / Solaris~]…

    Linux干货 2017-02-24
  • 什么叫Linux

    什么叫linux:     Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 谁编写的linux: Linux的出现,最早…

    Linux干货 2017-03-27
  • 基于httpd服务实验构建网站域名DNS解析

    具体组成简图 实验前期准备 httpd的安装 后期补充 做httpd 服务器的IP 为: 172.18.148.62 安装DNS域名解析包 bind yum install bind 修改DNS 的基础配置文件 /etc/named.conf   关闭所有的虚拟机的 防火墙 iptables -F CENTOS7 的系统关闭selinux sete…

    2017-04-16
  • pxe和dhcp服务——引导安装操作系统

    BootStraping:系统提供(OS Provision) pxe –> preboot excution environment, Intel cobbler –> Cobbler is a network install server.  Cobbler supports PXE, ISO virtual…

    Linux干货 2016-11-05
  • lamp+nfs搭建wordpress

    一、前言 lamp是大多上公司常用的架构,本文将针对分离式的lamp+nfs来搭建一个简单的wordpress网站。 二、架构图 三、基本实现过程 3.1:dns搭建 由于这这是一个实验,故使用yum搭建dns服务器 yum install -y bind 配置如下 dns主配置文件 dns辅助配置文件 zone文件 对所有服务…

    Linux干货 2015-10-16