文本处理工具

分页查看文件内容

less和more命令介绍

分页查看文件内容:less和more

less:一页一页地查看文件或STDIN输出  
# less FILE

less的快捷键:

    Ctrl+u:向上翻半屏

    Ctrl+d:向下翻半屏

    Ctrl+f:向下翻一屏

    Ctrl+b:向上翻一屏

    ! COMMAND:执行shell命令

    /string:搜索string

    ?string:搜索string

    n/N:跳到下一个 or 上一个匹配

    q:退出

注:less命令是man命令使用的分页器


more: 分页查看文件    
# more FILE

more [OPTIONS...] FILE...
    -d: 显示翻页及退出提示
[root@centos7 ~]# more /etc/rc.d/init.d/functions 
[root@centos7 ~]# less /etc/rc.d/init.d/functions 
[root@centos7 ~]# more -d /etc/rc.d/init.d/functions

文件查看

cat命令介绍
文件查看命令:cat, tac,rev

cat [OPTION]... [FILE]...

    -E: 显示行结束符$
    -n: 对显示出的每一行进行编号
    -A:显示所有控制符    
    -b:非空行编号
    -s:压缩连续的空行成一行

[root@centos7 tmp]# cat  file.txt 
[root@centos7 tmp]# cat -E file.txt 
[root@centos7 tmp]# cat -n file.txt 
[root@centos7 tmp]# cat -A file.txt 
[root@centos7 tmp]# cat -b file.txt
[root@centos7 tmp]# cat -s file.txt

cat1.png

cat2.png

cat3.png

显示文本前或后行内容

head
head [OPTION]... [FILE]...
    -c #: 指定获取前#字节
    -n #: 指定获取前#行
    -#:指定行数


tail
tail [OPTION]... [FILE]...
    -c #: 指定获取后#字节
    -n #: 指定获取后#行
    -#:
    -f: 跟踪显示文件新追加的内容,常用日志监控
[root@centos7 tmp]# head -5 /etc/passwd  显示/etc/passwd文件的前5行内容
[root@centos7 tmp]# tail -5 /etc/passwd  显示/etc/passwd文件的后5行内容

head1.png

按列抽取文本cut和合并文件paste

cut [OPTION]... [FILE]...
    -d DELIMITER: 指明分隔符,默认tab
    -f FILEDS:
        #: 第#个字段
        #,#[,#]:离散的多个字段,例如1,3,6
        #-#:连续的多个字段, 例如1-6
        混合使用:1-3,7
    -c按字符切割
    --output-delimiter=STRING指定输出分隔符


E.G 显示文件或STDIN数据的指定列
    cut-d:-f1/etc/passwd
    cat /etc/passwd|cut-d:-f7
    cut-c 2-5 /usr/share/dict/words



paste 合并两个文件同行号的列到一行
    paste [OPTION]... [FILE]...
        -d 分隔符:指定分隔符,默认用TAB
        -s : 所有行合成一行显示

        paste f1 f2
        paste -s f1 f2
[root@centos7 tmp]# cut -d: -f1,3,7 /etc/passwd | head -5  
root:0:/bin/bash
bin:1:/sbin/nologin
daemon:2:/sbin/nologin
adm:3:/sbin/nologin
lp:4:/sbin/nologin

以冒号为分隔符,显示/etc/passwd下第一列、第三列、第七列

文本数据统计:wc

计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN中的数据运行
# wc FILE
使用-l来只计数行数
使用-w来只计数单词总数
使用-c来只计数字节总数
使用-m来只计数字符总数

[root@centos7 tmp]# wc file.txt 
 2  3 12 file.txt
 
对应的分别为:行数、单词数、字节数(包括特殊字符)

[root@centos7 tmp]# cat -A file.txt 
my name is$
$

[root@centos7 tmp]# wc -l file.txt 
2 file.txt
[root@centos7 tmp]# wc -w file.txt 
3 file.txt
[root@centos7 tmp]# wc -c file.txt 
12 file.txt

文本排序sort

把整理过的文本显示在STDOUT,不改变原始文件
    # sort[options]file(s)
    常用选项
        -r执行反方向(由上至下)整理
        -n执行按数字大小整理
        -f选项忽略(fold)字符串中的字符大小写
        -u选项(独特,unique)删除输出中的重复行
        -t c选项使用c做为字段界定符
        -k X选项按照使用c字符分隔的X列来整理能够使用多次

uniq

uniq命令:从输入中删除重复的前后相接的行
uniq[OPTION]... [FILE]...
    -c: 显示每行重复出现的次数;
    -d: 仅显示重复过的行;
    -u: 仅显示不曾重复的行;
        连续且完全相同方为重复

常和sort 命令一起配合使用:
sort FILE | uniq-c

比较文件diff

比较两个文件之间的区别
# difffoo.conf-brokenfoo.conf-works
5c5
<use_widgets=no
---
>use_widgets=yes
注明第5行有区别(改变)

复制对文件改变patch

diff命令的输出被保存在一种叫做“补丁”的文件中
    使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。

patch命令复制在其它文件中进行的改变(要谨慎使用!)
适用-b选项来自动备份改变了的文件

# diff -u foo.conf-brokenfoo.conf-works > foo.patch
# patch -b foo.conf-brokenfoo.patch

向文件打补丁
    patch [OPTIONS] -i /PATH/TO/PATCH_FILE  /PATH/TO/OLDFILE
    patch  /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE

grep

文本处理工具之grep、egrep和fgrep
grep:(global search regular expression(RE)and print out the line)
文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,并显示匹配的行 

格式:grep [options] 'PATTERF' file,默认只支持基本正则表达式,
查看帮助:
    [root@centos7 tmp]# man 7 regex

要匹配额外功能的字符用-E
选项:
    --color=auto 指定颜色
    -v:反向匹配,显示不能被模式匹配到的行
    -o:仅匹配被模式匹配到的字串,而非整行
    -i:不区分大小写,ignore-case
    -c: 统计匹配的行数
    -n:显示匹配的行号
    -q: 静默模式,不输出任何信息
    -E:支持扩展
    -A #:还显示模式下面的一行
    -B #:还显示模式上面的一行
    -C #:前后各显示一行
    -e:实现多个选项间的逻辑or关系
        grep –e ‘cat ’ -e ‘dog’ file
    -w:整行匹配整个单词


正则表达式:是一类字符所书写出的模式(pattern) 
元字符:类似统配符,不表示字符本身的意义,用于额外功能性的描述

正则表达式引擎:
    采用不同算法,检查处理正则表达式的软件模块
    PCRE(Perl Compatible Regular Expressions)

基本正则表达式的元字符:
字符匹配:
    .:任意单个字符
    []:指定范围内的任意单个字符
        [0-9],[[:digit:]]
        [a-z],[[:lower:]]
        [A-Z],[[:upper:]]
        所有的字母:[[:alpha:]]
        字母+数字:[[:alnum:]]
        空格:[[:space:]]
        标点符号:[[:putct:]]
    [^]: 指定范围外的任意单个字符 

次数匹配:用来指定匹配其前面的字符的次数 
    *:任意次
       例子:x*y xxy xy y 都能匹配
    .*:匹配任意长度的任意字符
    \?:前面字符出现0次或者1次的
    \+:前面字符至少要出现1次   
    \{m\}:匹配m次
    \{m,n\}:至少m次,至多n次
    \{m,\}:至少m次
    \{0,n}:至多n次

工作模式为:贪婪模式;尽可能的长的去匹配字符:

位置锚定:用于指定字符出现的位置
   ^:锚定行首
     ^Char
   $:锚定行尾
      grepchar$
   ^$:空白行
   ^[[:space:]]*$ :空白行
单词的位置锚定
    \<char :锚定词首,\bchar
    char\> : 锚定词尾,char\b
        \<hello\>:锚定单词
分组:
    \(\)
    \(ab\)*xy
引用:
     \1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式匹配到的内容,
      意思是说前面出现一次,在\1这也要出现一次

E.G:\(a.b\)xy\1: a6bxya6b

       He like his lover.
       She love her liker.
       He love his lover.
       She like her liker.

[root@centos7 ~]# grep "\(l..e\).*\1r" grep.txt





egrep: 使用扩展正则表达来构建模式,相当于grep -E  
字符匹配: 
    .: 任意单个字符
    []: 指定范围内的任意单个字符
    [^]: 指定范围外的任意单个字符
次数匹配: 
    *:匹配其前面的字符任意次;
    ?: 匹配其前面的字符0或1次;
    +: 匹配其前面的字符至少1次
    {m}: 匹配其前面的字符m次;
    {m,n}: 至少m次,至多n次
    {m,}: 至少m次;
    {0,n}:至多n次;
位置锚定: 
    ^: 行首
    $: 行尾
    \<, \b: 词首
    \>, \b:词尾
分组: 
    (): 分组

|: 或者 
    a|b
    C|cat: C或cat
    (C|c)at:Cat或cat

最后附录上一些课堂练习
(自己写的,非标准答案)

1、找出ifconfig命令结果中本机的所有IPv4地址
2、查出分区空间使用率的最大百分比值
3、查出用户UID最大值的用户名、UID及shell类型
4、查出/tmp的权限,以数字方式显示
5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
6、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
7、显示/etc/passwd文件中不以/bin/bash结尾的行
8、显示用户rpc默认的shell程序
9、找出/etc/passwd中的两位或三位数
10、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
11、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
12、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
13、显示当前系统root、mage或wang用户的UID和默认shell
14、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
15、使用egrep取出/etc/rc.d/init.d/functions中其基名
16、使用egrep取出上面路径的目录名
17、统计以root身份登录的每个远程主机IP地址的登录次数
18、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
19、显示ifconfig命令结果中所有IPv4地址

自己做答的:

1、[root@centos7 ~]# ifconfig | tr -cs "[:digit:].[:digit:]" '\n' | sort  -u -n  -t'.' -k3
2、[root@centos7 ~]# df | tr -s ' ' ':' | cut -d: -f5 | sort -r 
3、[root@centos7 ~]# cat /etc/passwd | sort -t':' -k 3 -n -r | head -1 | cut -d: -f1,3,7
4、[root@centos7 ~]# stat /tmp/functions | tr -s ' ' ':' | head -4 | tail -1 | tr -cs [:alnum:] ':' | cut -d: -f2
5、[root@centos7 ~]# netstat -nt | tr -s ' ' | cut -d' ' -f5 | sort -n
6(1)、[root@centos7 ~]# grep -e ^S -e ^s /proc/meminfo
6(2)、[root@centos7 ~]# grep ^[Ss] /proc/meminfo
6(3)、[root@centos7 ~]# grep -i ^s /proc/meminfo
7、[root@centos7 ~]# grep -v "/bin/bash$" /etc/passwd
8、[root@centos7 ~]# grep "^\<rpc\>" /etc/passwd | cut -d: -f1,7
9、[root@centos7 ~]# cat /etc/passwd | grep  '\<[1-9][0-9]\{1,2\}\>'
10、[root@centos7 ~]# cat /etc/grub2.cfg | grep '^[[:space:]]\+[^[:space:]]'
11、[root@centos7 ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
12、[root@centos7 ~]# cat /etc/passwd | grep "^\<\(.*\)\>.*/\1$"
13、[root@centos7 tmp]# egrep "^\<(root|mage|wang)\>" /etc/passwd | cut -d: -f1,3,7
14、[root@centos7 tmp]# egrep "^(\<[^[:space:]]*\>|_)\(\)" /etc/rc.d/init.d/functions
15、[root@centos7 tmp]# echo "/etc/rc.d/init.d/functions/" | egrep  "[^/]+/?$"
16、[root@centos7 ~]# echo "/etc/sysconfig/network-scripts/" | sed 's@[^/]\+/\?$@@'
17、[root@centos7 tmp]# last | grep "root" | egrep "[[:digit:]]\.{1,3}" | tr -s ' ' | cut -d' ' -f1,3 | sort | uniq -c | sort -nr
18、[root@centos7 ~]# ifconfig |egrep -o "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" 
19、[root@centos7 ~]# ifconfig |egrep -o "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"

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