zoukankan      html  css  js  c++  java
  • LinuxShell——管道命令

    LinuxShell——管道命令

    摘要:本文主要学习了Shell中的管道命令。

    grep命令

    grep命令的作用是在文件中提取和匹配符合条件的字符串行,全称是Global Regular Expressions Print。

    基本语法

    1 grep [选项] 搜索内容 文件名

    选项说明

    1 -A n:n为数字,列出符合条件的行,并列出后续的n行。
    2 -B n:n为数字,列出符合条件的行,并列出前面的n行。
    3 -c:统计找到的符合条件的字符串的次数。
    4 -i:忽略大小写。
    5 -n:输出行号。
    6 -v:反向査找,也就是查询没有关键字的一行。
    7 --color=auto:搜索出的关键字用颜色显示。

    使用举例

     1 [root@localhost ~]# cat -n file | grep "hello"
     2      4    hello
     3      6    helloword
     4 [root@localhost ~]# cat -n file | grep -c "hello"
     5 2
     6 [root@localhost ~]# cat -n file | grep -n "hello"
     7 4:     4    hello
     8 6:     6    helloword
     9 [root@localhost ~]# cat -n file | grep -n -A 3 "hello"
    10 4:     4    hello
    11 5-     5    ss
    12 6:     6    helloword
    13 7-     7    test123hhhhhhhhh
    14 8-     8    ddsdfas
    15 [root@localhost ~]# 

    sed命令

    sed命令是用来处理流的编辑命令,全称是Stream Editor,用程序的方式来编辑文本,它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。

    sed会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

    基本语法

    1 sed [选项] [范围][脚本] 文件名

    选项说明

    1 -n:使用安静模式。默认会将文件的所有内容都输出到屏幕上,使用-n以后只会显示经过处理的内容。
    2 -e 脚本命令:将其后跟的脚本命令添加到已有的命令中。
    3 -f 脚本文件:将其后文件中的脚本命令添加到已有的命令中。
    4 -r:使命令支持扩展元字符的正则表达式,默认支持基础元字符的正则表达式。
    5 -i:直接修改文件内容。

    范围说明

    范围指的就是sed脚本命令的作用范围,用来表明该脚本命令作用到文本中的具体行。

    默认情况下,sed命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须指明范围,表示的方法有以下两种种:

    1)以数字形式指定行区间。

    当使用数字方式的行寻址时,可以用行在文本流中的行位置来引用。sed会将文本流中的第一行编号为1,然后继续按顺序为接下来的行分配行号。

    1 n:单个数字表示指定第n行作为sed命令的作用范围。
    2 n1,n2:两个数字用“,”分隔表示指定包含第n1行到第n2行的内容作为sed命令的作用范围。
    3 n,$:表示指定范围包含n开始到结束所有内容作为sed命令的作用范围。

    2)用文本模式指定具体行区间。

    sed允许指定文本模式来过滤出命令要作用的行,必须用“/”将要指定的文本封起来,sed会将该命令作用到包含指定文本模式的行上,多个内容需要被“/”封起来并且使用“,”分隔。

    脚本说明

    脚本命令a用来在指定行的下一行添加新增的内容:

    1 [范围]a新内容

    脚本命令i用来在指定行的上一行插入新增的内容:

    1 [范围]i新内容

    脚本命令c用来将指定范围的内容替换为新内容:

    1 [范围]c新内容

    脚本命令s用来将指定范围内的指定内容替换成新内容,可以搭配正则表达式使用,也被常用来删除指定的内容:

    1 [范围]s/查询内容/新内容/flags

    其中,常用的flags标记:

    1 g:对数据中所有匹配到的内容进行替换,如果没有g,则只会在第一次匹配成功时做替换操作。2 p:会打印与替换命令中指定的模式匹配的行。此标记通常与-n选项一起使用。

    脚本命令d用来删除指定范围的内容:

    1 [范围]d

    脚本命令p用来将选取出来的内容显示在命令行上,通常配合-n使用:

    1 [范围]p

    脚本命令w用来将文本中指定范围的内容写入新文件中:

    1 [范围]w 新文件

    脚本命令r用来将新文件的数据插入到当前文件的指定范围:

    1 [范围]r 新文件

    使用举例

    脚本命令a:

    1 [root@localhost ~]# cat -n file | sed '3a	est'
    2      1    ccccc
    3      2    bbbbb
    4      3    dd
    5 test
    6      4    hello
    7 [root@localhost ~]#

    脚本命令i:

    1 [root@localhost ~]# cat -n file | sed '3i	est'
    2      1    ccccc
    3      2    bbbbb
    4 test
    5      3    dd
    6      4    hello
    7 [root@localhost ~]#

    脚本命令c:

    1 [root@localhost ~]# cat -n file | sed '3c	est'
    2      1    ccccc
    3      2    bbbbb
    4 test
    5      4    hello
    6 [root@localhost ~]# 

    脚本命令s:

     1 [root@localhost ~]# cat -n file | sed '2s/bb/aa/'
     2      1    ccccc
     3      2    aabbb
     4      3    dd
     5      4    hello
     6 [root@localhost ~]# cat -n file | sed '2s/bb/aa/g'
     7      1    ccccc
     8      2    aaaab
     9      3    dd
    10      4    hello
    11 [root@localhost ~]#

    脚本命令d:

    1 [root@localhost ~]# cat -n file | sed '2d'
    2      1    ccccc
    3      3    dd
    4      4    hello
    5 [root@localhost ~]# 

    脚本命令p:

    1 [root@localhost ~]# cat -n file | sed -n '2p'
    2      2    bbbbb
    3 [root@localhost ~]# 

    脚本命令w:

    1 [root@localhost ~]# cat -n file | sed -n '1,3w test'
    2 [root@localhost ~]# cat test
    3      1    ccccc
    4      2    bbbbb
    5      3    dd
    6 [root@localhost ~]# 

    脚本命令r:

     1 [root@localhost ~]# cat -n file | sed '1,2r test'
     2      1    ccccc
     3 ccccc
     4 bbbbb
     5 dd
     6      2    bbbbb
     7 ccccc
     8 bbbbb
     9 dd
    10      3    dd
    11      4    hello
    12 [root@localhost ~]# 

    awk命令

    awk命令也是逐行扫描文件,寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作,反之则不对行做任何处理。

    awk命令的名字来源于此命令的设计者,他们的姓分别是Aho、Weingberger和Kernighan,awk就取自这三位大师姓的首字母。

    基本语法

    1 awk [选项] [脚本] 文件名

    默认情况下,awk会将如下变量分配给它在文本行中发现的数据字段:

    1 $0:代表整个文本行。
    2 $1:代表文本行中的第1个数据字段。
    3 $2:代表文本行中的第2个数据字段。
    4 $n:代表文本行中的第n个数据字段。

    前面说过,在awk中,默认的字段分隔符是任意的空白字符(例如空格或制表符)。在文本行中,每个数据字段都是通过字段分隔符划分的。awk在读取一行文本时,会用预定义的字段分隔符划分每个数据字段。

    选项说明

    1 -F 分隔符:指定输入行的分隔符,默认分隔符为空格或制表符。
    2 -f 脚本文件:从脚本文件中读取命令,取代在命令行中输入的命令。
    3 -v 变量名=变量值:在执行处理过程之前,设置变量名和变量值。

    脚本说明

    awk的强大之处在于脚本命令,它由规则和命令两部分组成:

    1 '匹配规则 {执行命令}'

    匹配规则用来指定脚本命令可以作用到文本内容中的范围,可以使用字符串或者正则表达式指定。

    整个脚本命令是用“''”括起来,而其中的执行命令部分需要用大括号“{}”括起来。

    如果没有指定执行命令,则默认会把匹配的行输出。如果没有指定匹配规则,则默认匹配文本中所有的行。

    使用举例

    使用数据字段变量,输出内容之间使用“,”分隔:

    1 [root@localhost ~]# echo 'Hello Word' | awk '{print $0}'
    2 Hello Word
    3 [root@localhost ~]# echo 'Hello Word' | awk '{print $1, $1$2}'
    4 Hello HelloWord
    5 [root@localhost ~]# 

    执行多条命令,只要在命令之间使用“;”分隔或者使用回车键分隔即可:

    1 [root@localhost ~]# echo 'Hello Word' | awk '{$2="Hello"; print $0}'
    2 Hello Hello
    3 [root@localhost ~]# echo 'Hello Word' | awk '{$2="Hello"
    4 > print $0}'
    5 Hello Hello
    6 [root@localhost ~]# 

    使用匹配规则指定范围,“/字符串/”表示匹配含有指定字符串或者正则表达式的行,“$0~/字符串/”用来限制符合匹配规则的数据字段:

    1 [root@localhost ~]# awk '$0~/^T.*o/' file
    2 Two lines of test text.
    3 Three lines of test text.
    4 [root@localhost ~]# awk '$1~/Two/' file
    5 Two lines of test text.
    6 [root@localhost ~]# 

    使用逻辑运算符,匹配规则允许使用逻辑运算符(>、<、>=、<=、==、!=)进行匹配:

    1 [root@localhost ~]# awk '$1=="Two" {print $0}' file
    2 Two lines of test text.
    3 [root@localhost ~]# 

    BEGIN会强制在命令执行前执行BEGIN后面指定的脚本命令:

    1 [root@localhost ~]# awk 'BEGIN {print "Begin Read File ..."} {print $0}' file
    2 Begin Read File ...
    3 One line of test text.
    4 Two lines of test text.
    5 Three lines of test text.
    6 [root@localhost ~]#

    END会强制在命令执行前执行END后面指定的脚本命令:

    1 [root@localhost ~]# awk 'END {print "End Read File ..."} {print $0}' file
    2 One line of test text.
    3 Two lines of test text.
    4 Three lines of test text.
    5 End Read File ...
    6 [root@localhost ~]# 

    从文件中读取命令,指定分隔符,设定变量:

    1 [root@localhost ~]# cat script
    2 BEGIN {FS=":"} {print $1 " -> " v}
    3 [root@localhost ~]# awk -v v=var -f script file
    4 One -> var
    5 Two -> var
    6 Three -> var
    7 [root@localhost ~]# 
  • 相关阅读:
    在controller的action内, 得到用户发过来的请求地址和参数url
    php Connection timed out after 30000 milliseconds
    htmlspecialchars_decode 解决掉 &amp;
    max_spare_servers到底是个什么意思?
    mysql 不同条件count ,多条件count()
    阿里云centOS7.4 ftp连接不上的问题
    阿里云 导入自定义的镜像
    thinkphp3.2.3 + nginx 配置二级域名
    FlashFXP客户端 FTP连接,连接很慢的情况,
    PHP对象的使用,什么时候可以用中括号[], 什么时候可以用箭头->
  • 原文地址:https://www.cnblogs.com/shamao/p/11209391.html
Copyright © 2011-2022 走看看