1、cat、tac、rev命令-文件查看

1)、cat命令

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

    命令中的...表示可用多个选项查看多个文件
    -E:显示行结束符$
    -n:对显示出的每一行进行编号
    -A:显示所有控制,包括空格、tab、换行等多种控制符
    -b:只对非空行编号
    -s:压缩连续的空行成一行

此外文件合并也可以使用cat命令实现,例如#cat fi ffi > fffi,意思是把fi和ffi文件合并进入fffi文件,其中fffi文件中文件内容是按ffi文件内容接着fi文件内容列示的

2)、tac命令(此命令的作用是使文本内容反过来显示,例如第一行列为最后一行,第二行列为倒数第二行,等等,依次反过来显示)

3)、rev命令(此命令的作用是使文本内容每行倒过来显示,就是每一行的最后一个字符在第一个位置显示,倒数第二个字符在第二个位置显示,等等,依次倒过来显示

2、more和less命令-分页查看文本内容

1)、more:分页查看文件
    more [OPTIONS...] FILE... 

    空格键翻页显示,但是不能往回翻页

    -d:显示翻页及退出提示,例如显示“press space to continue,q to quit”提示信息

2)、less:一页一页地查看文件或STDIN输出
    查看时有用的命令包括:
    /文本搜索 文本 ,从当前位置往下搜索

    ?文本搜索 文本,从当前位置往上搜索

    n/N跳到下一个 or 上一个匹配
less命令是man命令使用的分页符

3、head、tail命令-显示文本前或后行内容

1)、head命令显示文本前行内容
    head [OPTION]... [FILE]...
    -c #:指定获取前#字节
    -n #:指定获取前#行
    -#:指定前几行数
2)、tail命令显示文本后行内容
    tail [OPTION]... [FILE]...
    -c #:指定获取后#字节
    -n #:指定获取后#行
    -#:指定后几行数
    -f:跟踪显示文件新追加的内容, 常用日志监控

    例如在一个端口执行#tail -n 0 -f file,则在另一个端口执行#echo "string" >> file时会在前一个端口实时显示输入的文本内容;或者加上&号实现后台实时显示,例如#tail -n 0 -f file &可实现在另一个端口执行#echo "string" >> file时会在前一个端口实时显示输入的文本内容,而且前一个端口仍可以进行其它操作

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

1)、cut命令

    cut [OPTION]... [FILE]...
    -d:指明分隔符(所谓分隔符是文本中的标志性的可作为文本内容分段的符号,可以是字母、空格、标点符号等默认tab)例如#cut -d:-f2 file,其中的:符号就是指明的分隔符,2是第二个字段
    -f#:所谓一个字段就是分隔符之间的一段内容

         #:第#个字段
         #,#[,#]:离散的多个字段,例如1,3,6
         #-#:连续的多个字段, 例如1-6
         混合使用:1-3,7
    -c 按字符切割,例如#cut -c44-46 file即是显示file文件的第44个字符到第46个字符之间的列
    --output-delimiter=STRING指定输出分隔符,其中STRING即是指代要指定的分隔符,例如*号

    [root@centos7 ~]# getent passwd |cut -d: -f1,3 --output-delimiter=*即是把抽取的列之间的分割符指定为*号,否则就是:号

2)、paste命令

     paste合并两个文件同行号的内容到一行
     paste [OPTION]... [FILE]...
       -d:指定合并后文件内容之间的分隔符,默认用TAB
       -s:所有行合成一行显示,即是每个文件的所有行内容合成一行后,文件间再实现内容合并
     #paste f1 f2,即是以tab为分隔符

     #paste -d: f1 f2,当然也就是指定:号为分隔符
     #paste -s f1 f2

5、wc命令-收集文本统计数据

   计数行总数、单词总数、字符总数,可以对文件或STDIN中的数据运行
   $ wc story.txt
   39 237 1901 story.txt
   行数 单词数 字符数
使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -m 来只计数字符总数 

   #wc可以进行标准写入操作,按Ctrl+d可以收集写入文本的统计数据

   [root@centos7 ~]# ls | wc -l,输出的结果是20,说明其实ls的文件是一个一行显示的,只不过终端显示出来的不是一行一行显示的(不统计隐藏文件)

6、sort命令-文本排序

把整理过的文本显示在STDOUT,不改变原始文件
   $sort [options] file(s) 

   对于非数字字符是按照特殊符号-字母顺序排列的

常用选项:
 -r 执行反方向(由大到小)整理
 -n 执行按数字大小整理,即是从小到大顺序排列
 -f 选项忽略(fold)字符串中的字符大小写
 -u 选项(独特,unique )删除输出中的重复行
 -t c 选项使用c做为字段界定符
 -k X 选项使用c字段界定符分隔整理第X列

7、uniq命令-从输入中删除前后相接的重复的行
   uniq [OPTION]... [FILE]...
   -c:显示每行重复出现的次数;
   -d:仅显示重复过的行;
   -u:仅显示不曾重复的行;
注意-连续且完全相同方为重复
常和sort命令一起配合使用,例如#sort userlist.txt | uniq -c

8、diff命令-比较两个文件之间的区别

    #diff fi ffi,比较fi与ffi两个文件的区别,并输出比较信息

    #diff -u fi ffi,加上选项u输出“统一的(unified)”diff格式文件,最适用于补丁文件 ,所以一般此统一的输出重定向到指定的文件中,譬如diff.log

    如果ffi因为误删而丢失,可以通过以下命令恢复找回ffi文件:

    [root@centos7 ~]#patch -b fi diff.log

    此时[root@centos7 ~]#ls中会生成fi.orig文件,其实其就是原来的fi,因为其是fi的备份;同时fi储存的信息变为ffi,恢复找回的ffi就是fi文件,内容是一样的,可以把fi的文件名改为ffi

9、grep命令-文本过滤也即文本搜索( 模式pattern) 工具

 grep, egrep(egrep=grep -E), fgrep(不支持正则表达式搜索,但是搜索更加快捷)

作用:(Global search REgular expression and Print outthe line)文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行;

  模式:由正则表达式字符及文本字符所编写的过滤条件(模式既是过滤条件);

  grep [OPTIONS] PATTERN [FILE...]

  --color=auto: 对匹配到的文本着色显示

    -v: 显示不能够被pattern匹配到的行

    -i: 忽略字符大小写

    -n:显示匹配的行号

    -c: 统计匹配的行数

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

    -q: 静默模式,不输出任何信息,使用于只要知道是否执行成果而不需要显示结果时

           例如#grep -q "root" /etc/passwd 或者#grep "root" /etc/passwd &> /dev/dull

               #|echo $?

               如果返回值是0,则是表示执行成功;返回值是非零,表示执行失败

    -A #:after, #

    -B #: before, #

    -C #:context, 前后各#行

    -e:实现多个选项间的逻辑or关系

例如#grep –e‘cat ’ -e ‘dog’ file

    -w:整行匹配整个单词,是整行所有单词都是一个单词,则以该单词为模式时才可匹配成功

  例如: #grep root /etc/passwd,因为没有锚定,所有像包含arootb的行也会被过滤出

           #grep "$USER" /etc/passwd,此命令以$USER返回值root为模式

           #grep '$USER' /etc/passwd,此命令以$USER本身为模式

           #grep `whoami` /etc/passwd此命令以$USER返回值root为模式

    补充:关于””、’’、` `的引用问题

           #echo $USER此命令的返回值是root

           #echo “$USER”变量会替换-此命令的返回值是root

           #echo ‘$USER’变量不会替换-此命令的返回值是$USER

           #echo `$USER`,此命令的返回值是执行错误,因为``是命令行扩展,其中应是cmd

              #echo $(USER)此命令的返回值是执行错误,因为$()是命令行扩展,其中应是cmd

10)、正则表达式与双引号(模式一般要用双引号引起来)

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

  正则表达式程序支持:grepegrep vim lessnginx等等;

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

  基本正则表达式元字符

   ⑴、字符匹配:

    . 匹配任意单个字符

    [] 匹配指定范围内的任意单个字符,但是[a-c]表示abc中的任一个,运用于文件内容的过滤

       但是作为通配符时[a-c]表示aAbBc中的任一个,运用于文件名的统配搜索

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

    [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]

   ⑵、匹配次数:

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

     *:匹配前面的字符任意次,包括0次(贪婪模式—尽可能长的匹配) 

          例如:ro*t表示rt、rot、root等,其中注意其中包括rt

          但是*在通配符中表示任意长度的字符

     .*:任意长度的任意字符,相当于通配符里的*

         但是前者运用于文件内容过滤,后者运用于文件名的统配搜索

     \?:匹配其前面的字符0 或1次

     \+:匹配其前面的字符至少1

     \{m\}:匹配前面的字符m

     \{m,n\}:匹配前面的字符至少m 次,至多n

     \{,n\}:匹配前面的字符至多n次

     \{m,\}:匹配前面的字符至少m

   ⑶、位置锚定:

   定位出现的位置

     ^:行首锚定,用于模式的最左侧,

    例如#grep ^root /etc/passwd,过滤出所有以root开头的行,其中就是以rootrr开头的行也会包括在过滤结果之中;但是#grep "^root\>" /etc/passwd 命令只能过滤出仅仅以root开头的行。

     $:行尾锚定,用于模式的最右侧

     ^PATTERN$: 用于模式匹配整行

       ^$: 空行

       ^[[:space:]]*$: 空白行也即是空行与白行的合称,白行里面有空格或者tab

     \< \b:词首锚定,用于单词模式的左侧

     \> \b:词尾锚定;用于单词模式的右侧

     \<PATTERN\>:匹配整个单词

     例如: #grep root /etc/passwd,因为没有锚定,所有像包含arootb的行也会被过滤出

    ⑷、分组

    \(\):将一个或多个字符捆绑在一起作一个整体进行处理

    如:\(root\)\+分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ... 

    注意其中的\+表示的是root这个单词作为整体重复一次以上

    \1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
     实例:\(string1\+\(string2\)*\)
           \1: string1\+\(string2\)*
           \2: string2

    后向引用:引用前面的分组括号中的模式所匹配到的字符(而非模式本身) 

    例如文件fi的内容为:

           abcde:klajiab

           abcde:klajimn

           abcde:ghhiucd

           abcde:ghhiuabcd

[root@centos7 ~]# grep "^\(ab\).*\1$" fi,因为\1指定ab,所以第一行符合过滤要求 

[root@centos7 ~]# grep "^\(ab\+\(cd\)\).*\1$" fi,因为\1指定abcd,所以第四行符合过滤要求

[root@centos7 ~]# grep "^\(ab\+\(cd\)\).*\2$" fi,因为\2指定cd,所以第三第四行均符合过滤要求

[root@centos7 ~]# grep "^\([[:lower:]]\{2,\}\).*\1$" fi,因为\1指定的不是模式本身,而是模式匹配到的字符ab和abcd,所以命令匹配到的结果是第一第四行

   扩展的正则表达式

   egrep=grep -E
   egrep [OPTIONS] PATTERN [FILE...]
   扩展正则表达式的元字符:
   ⑴、字符匹配:
      .任意单个字符
      []指定范围的字符
      [^]不在指定范围的字符

   ⑵、次数匹配:
      *:匹配前面字符任意次
      ?: 0或1次 次
      +:1次或多次
     {m}:匹配m次 次
     {m,n}:至少m ,至多n次 次

   ⑶、位置锚定:
      ^: 行首
      $: 行尾
      \<, \b: 语首
      \>, \b: 语尾

   ⑷、分组:
      ()
      后向引用:\1, \2, ...

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

      示例#egrep "^(root|wang|tom):" /etc/passwd |cut -d: -f1,3,7