zoukankan      html  css  js  c++  java
  • 4、linux-grep awk sed and cuf sort uniq join

     1、grep

    1、1 grep [-invc] [--color=auto] '搜寻字符串' filename
    选项与参数:
    -i :忽略大小写的不同
    -n :顺便输出行号
    -v :显示没有 '搜寻字符串' 的行
    --color=auto :将找到的部分加上颜

    -c :统计比配的行数

    -w : 仅完全匹配字词

    -o : 只输出匹配的内容

    -A2:匹配的行以及其下面的2行

    -B2:匹配的行以及其上面的2行

    -C2:匹配的行以及其上下面的2行

    例1:less file1 |cut -f 1 |xargs -i echo grep -v -A1 -w {} file2|sh   ##剔除不要的fa文件的ID和序列

    例2:grep -P -o 'ID=id(d);' GCF_000151425.1_ASM15142v1_genomic.gff|le    ##提取基因ID

    例3grep -F -f

    grep -F -f  A B | tee both.txt | wc -l
    grep -F -f A -v  B |tee onlyB.txt |wc -l
    grep -F -f B -v A | tee onlyA.txt |wc -l
     

    grep -n '^$' file     #空白行grep [^ \t\n]

    特殊字符

    符号         含义           举例

     ^         开始标记        "^abc"满足的例子abc、abcd

    ^          非(在[]内)      "[^abc]"满足的例子:ddd、mpd

    $          结束标记        ”abc$”满足的例子abc、mmabc

    .           任意字符        "a.c"满足的例子abc、fapcc

    <            匹配单词开始      "<abc"满足的例子abc、abcd

    >            匹配单词结束      "abc>"满足的例子abc、pmrabc

    |              或             "AAA|BBB"满足的例子AAA、BBBpp

    范围字符

    符号         含义           举例

    ?     匹配前一个字符0或1次       "abc?"满足的例子ab、mabcd

    *     匹配前一个字符≥0次       "abc*"满足的例子abbb、abcdk

    +     匹配前一个字符≥1次       "abc+"满足的例子abcd、abcccdd

    {}     {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次 "abc{3,5}      "满足的例子abcccc、abcccccc

    []     []内如果不是范围,选其一;是范围的话,范围内选其一         "m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp

    ()     将候选的所有元素放在()内,用|隔开         "a(1|2|3)bc"满足的例子a1bc、mba3bcd

    注意:{}在正则表达式中需要转义,而[]()不需要。    

    注意理解{}范围的例子:

    在Linux的grep命令中如何使用OR,AND,NOT操作符呢?

    Grep OR 操作符

    1.使用 |                      如果不使用grep命令的任何选项,可以通过使用 '|' 来分割多个pattern,以此实现OR的操作。        

                                            grep 'pattern1|pattern2' filename  

    2.使用选项 -E             grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。

                                          grep -E 'pattern1|pattern2' filename  

    3.使用 egrep              egrep 命令等同于‘grep -E’。因此,使用egrep (不带任何选项)命令,以此根据分割的多个Pattern来实现OR操作.

                                         egrep 'pattern1|pattern2' filename  

    4、使用选项 -e         使用grep -e 选项,只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个pattern,以此实现OR操作。

                                         grep -e pattern1 -e pattern2 filename  

    Grep AND 操作

    1.使用 -E 'pattern1.*pattern2'        grep命令本身不提供AND功能。使用 -E 选项可以实现AND操作。

                                                                 grep -E 'pattern1.*pattern2' filename  

                                                                 grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename  

    2.使用多个grep命令                     可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。

                                                                 grep -E 'pattern1' filename | grep -E 'pattern2'  

    Grep NOT操作

    1.使用选项 grep -v                 使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。

                                                                 grep -v 'pattern1' filename  

    2、awk 

    awk '{pattern + action}' {filenames}
    awk [-F  field-separator]  'commands'  input-file(s)
    [-F 域分隔符]  :是可选的;
    commands      :是真正awk命令;
    input-file(s)  :是待处理的文件;

    awk工作流程:读入有' '换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,
    在不指名-F域分隔符的情况下,默认域分隔符是"空白键" 或 "[tab]键"

    例子
    cat /etc/passwd |awk  -F ':'  '{print $1}'       #这种是awk+action的示例,每行都会执行action{print $1}。
    awk -F: '/root/' /etc/passwd               #这种是awk+pattern的示例,匹配了pattern的行才会执行action(没有指定action,默认输出每行的内容)。
    awk -F: '$1~/root/' /etc/passwd              
    cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'        
    #先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action。读入第二条记录·····,最后执行END操作。
    
    

    awk内置变量

    ARGC               命令行参数个数
    ARGV               命令行参数排列
    ARGIND 命令行参数的索引 AWK 'ARGIND==1{f1[$1]=$2}ARGIND==2{if($1 in f1){print $0}}' file1 file2 a[$0]=a[$0]""
    ENVIRON 支持队列中系统环境变量的使用
    FILENAME           awk浏览的文件名 
    FNR 浏览文件的记录数
    F选项
    NF 浏览记录的域的个数
    NR 行数(记录数)
    OFS 输出域分隔符
    ORS 输出记录分隔符
    RS 控制记录分隔符

    awk编程

      变量和赋值

      除了awk的内置变量,awk还可以自定义变量。

    awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd

    count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。

    这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0:

    awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd

      条件语句

    ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'

      数组

    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

    awk编程的内容极多,这里只罗列简单常用的用法,更多请参考http://www.gnu.org/software/gawk/manual/gawk.html

    3、sed

    打印:

    sed -n '2p' file        #('2,4'  '1,$'  '/aa/')

    删除:

    sed  '2d' file         #('2,4'  '1,$'  '/aa/')

    替换、调换、增加、删除

    sed  '1,7s/aa/bb/g' file       #('s/aa/bb/g')

    sed  's/(abc)(ABC)/21/g'  file  

    sed  's/^.*$/122&/g  file

    sed  's/aa//g'

     4、cut


    cut -d'分隔字符' -f fields <==用于有特定分隔字符 cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符;默认的分割符是tab键,空格的表示是-d ' ' -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间;

      cut -d ':' -f 3,5 #提出第3列与第5列                     cut -c1-4  #提出第1到第4个字符

      cut -d ':' -f 3,5-7 #提出第3列,第5列到第7列                cut -d ':' -f 5-   #提出第5列到最后一列

     5、sort

    sort [-fbMnrtuk] [file or stdin]
    选项与参数:
    -f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
    -b  :忽略最前面的空格符部分;
    -M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
    -n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
    -r  :反向排序;
    -u  :就是 uniq ,相同的数据中,仅出现一行代表;
    -t  :分隔符,默认是用 [tab] 键来分隔;
    -k  :以那个区间 (field) 来进行排序的意思
    cat /etc/passwd | sort -t ':' -k1,1 -k2,2nr           #以 : 分隔,第一列字符升序,第二列按照数字降序排列
    cat /etc/passwd | sort -t ':' -k 3n          #默认以字符串来排序,如果想要使用数字排要加(n);
    cat /etc/passwd | sort -t ':' -k 3nr         #默认是升序,要倒序排序(r);
    cat /etc/passwd |  sort -t':' -k 6.2,6.4 -k 1r   #以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序

     6、uniq

    uniq [-cu]
    选项与参数:
    -d  :只显示重复的行;
    -c  :进行计数,第一列是计数列,第二列是原始列
    -u  :只显示唯一的行
    cat words | sort |uniq     #去除重复

       sort testfile | uniq -c    #只显示没类重复次数

       sort testfile | uniq -uc   #只显示没重复的行

       sort testfile | uniq -dc   #只显示有重复的行(前面显示重复的次数)

    整理uniq -c的结果,第二列是计数列,第一列是原始列
    例子:sort file | uniq -c | awk 'BEGIN{OFS=" "}{print $2,$1}'

    sort file | uniq -c | perl -lane 'print "@F[1] @F[0]"'

     7、join

    join [-i][-a<12>][-e<字符串>][-o<格式>][-t<字符>][-v<12>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]
    转载:http://jjuanxi.blog.163.com/blog/static/17527419720121954756361/
    功能说明:将两个文件中,指定栏位内容相同的行连接起来。 

    补充说明:找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。


    -a FILENUM:除了显示匹配好的行另外将指定序号(1或2)文件中部匹配的行显示出来
       -e EMPTY:将需要显示但是文件中不存在的域用此选项指定的字符代替
       -i :忽略大小写
       -j FIELD :等同于 -1 FIELD -2 FIELD,-j指定一个域作为匹配字段
       -o FORMAT:以指定格式输出
       -t CHAR :以指定字符作为输入输出的分隔符
              join 默认以空白字符做分隔符(空格和 ),可以使用 join -t $' '来指定使用tab做分隔符
       -v FILENUM:与-a相似 但值显示文件中没匹配上的行
       -1 FIELD:以file1中FIELD字段进行匹配
       -2 FIELD:以file2中FIELD字段进行匹配
       --help :打印命令帮助文件
    例子:
    文件 file1.txt
        aa 1 2
        bb 2 3
        cc 4 6
        dd 3 3
    文件file2.txt

        aa 2 1
        bb 8 2
        ff 2 4
        cc 4 4
        dd 5 5

    3. join -1 2 -2 3 file1.txt file2.txt
    输出: 1 aa 2 aa 2
         2 bb 3 bb 8
         4 cc 6 ff 2 
         4 cc 6 cc 4
     以第一个文件的第二列和第二个文件的第三列做匹配字段。由于第二个文件中第三列的两个3 都与第一个文件中第三行因此输出
        4 cc 6 ff 2 
        4 cc 6 cc 4
    4 join -o 1.1 -o 1.2  -o 1.3 -o 2.1 -o 2.2 -o 2.3   -e 'empty' -a 1  file1.txt file2.txt  
    输出: aa 1 2 aa 2 1
           bb 2 3 bb 8 2
        cc 4 6 empty empty empty
        dd 3 3 empty empty empty

     -o 指定 将file1的1,2,3列,file2的1,2,3 列都输出。-a指定将file1中不匹配的行也输出,但是file2中没有与file1后两行对应的字段,因此使用empty补齐。

    6. join 标准输入
      有时我们需要将多个格式相同的文件join到一起,而join接受的是两个文件的指令,此时我们可以使用管道和字符“-"来实现
        join file1 file2 | join - file3 | join - file4  
      这样就可以将四个文件 连接到 一起了。

     8、paste

    paste格式为:
           paste -d -s -file1 file2
          选项含义如下:
                         -d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。
                         -s 将每个文件合并成行而不是按行粘贴。
                         - 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。(这个参数的解释是网上找来的,但从后面的例子来看,应该是对输出的列进行设置。)

       例1  、paste -d: pas2 pas1

        P.Jones:ID897
    S.Round:ID666
    L.Clip:ID982

    例2、paste -s pas1 pas2 ##要合并两行,而不是按行粘贴,可以使用-s选项。下面的例子中,第一行粘贴为ID号,第二行是名字。
       ID897   ID666   ID982
    P.Jones S.Round L.Clip
    例3、ls /etc | paste -d" " - - - - - -
    paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个6列格式显示目录列表。

     
    
    
    
     
  • 相关阅读:
    element:记一次重置表单引发提交数据为默认数据现象
    三种常用又简单的排序算法
    (07)GitHub从2021.08.13开始使用Token代替账号和密码
    does not implement methodSignatureForSelector:
    自用python库
    2048
    CCSP2021游记
    2021 CCPC 桂林站游记
    2021 ICPC 沈阳站游记
    2021SDU新生赛游记
  • 原文地址:https://www.cnblogs.com/renping/p/6915639.html
Copyright © 2011-2022 走看看