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列格式显示目录列表。

     
    
    
    
     
  • 相关阅读:
    231. Power of Two
    204. Count Primes
    205. Isomorphic Strings
    203. Remove Linked List Elements
    179. Largest Number
    922. Sort Array By Parity II
    350. Intersection of Two Arrays II
    242. Valid Anagram
    164. Maximum Gap
    147. Insertion Sort List
  • 原文地址:https://www.cnblogs.com/renping/p/6915639.html
Copyright © 2011-2022 走看看