• grep详解、sed详解、awk详解


    一、grep  

     1、简介
    linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
    grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

    2、语法格式
    grep [OPTION]...PATTERN [FILE] ...

    3、主要参数
    [options]主要参数:
    -c:只输出匹配了多少次。
    -i:不区分大小写(只适用于单字符)。
    -h:查询多文件时不显示文件名。
    -l:查询多文件时只输出包含匹配字符的文件名。
    -n:显示匹配行及行号。
    -s:不显示不存在或无匹配文本的错误信息。
    -v:显示不包含匹配文本的所有行。
    -d:跳过对子目录的搜索
    -r: 对子目录也进行查找

    4、grep正则表达式元字符集(基本集):
    \:忽略正则表达式中特殊字符的原有含义。
    ^:匹配正则表达式的开始行,如:'^grep'匹配所有以grep开头的行。
    $: 匹配正则表达式的结束行,如'grep$'匹配所有以grep结尾的行。
    \<:从匹配正则表达式的行开始。如'\<grep'匹配包含以grep结尾的单词的行。
    \>:到匹配正则表达式的行结束。如'grep\>'匹配包含以grep结尾的单词的行。
    []:匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。需要特別留意的是,在 [] 当中『仅代表一个待搜寻的字元』
    [ n1-n2 ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
    [^xyz] 匹配除方括号中字符外的所有字符。
    . :所有的单个字符。
    * :有字符,长度可以为0。


    5、用于egrep和 grep -E的元字符(扩展集)
    + 匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
    ? 匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。
    a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
    () 分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。

    6、例句

    # 显示过滤注释( # ; 开头) 和空行后的配置信息
    $ grep -Ev "^$|^[#;]" server.conf
    
    #显示匹配出以开头为空格的行
    cat -n /root/ryan/shell/fist.sh |egrep -in "[' ']+"
    
    #显示文件名是字母的文件
    ls | egrep -in '[a-z]+'   

    二、sed

    1、简介
    sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
    每次仅读取一行内容;
    根据提供的规则命令匹配并修改数据。注意,sed 默认不会直接修改源文件数据,而是会将数据复制到缓冲区中,修改也仅限于缓冲区中的数据;
    将执行结果输出。
    当一行数据匹配完成后,它会继续读取下一行数据,并重复这个过程,直到将文件中所有数据处理完毕。

    2、语法格式
    sed的命令格式:sed [options] [-e] 'script' file(s);
    sed的脚本格式:sed [options] -f scriptfile file(s);
    ########################################
    3、主要参数
    [options]主要参数
    -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
    -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
    -i :直接修改文件内容;
    -n :只打印模式匹配的行;

    ‘script’主要参数
    a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
    c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~

    4、例句


    1)、插入动作
    #在testfile文件的第四行后添加一行
    # sed -i ‘4a\newLine’ testfile 
    #在第二行上插入数据
    sed -i ‘2i\newline’ testfile
    (2)、删除动作
    #删除第四行
    #sed -i ‘4d’ testfile
    要删除第 3 到最后一行
    #sed -i ‘3,$d’ testfile
    #删除空白行:
    sed '/^$/d' file
    # 删除文件中所有开头是test的行:
    sed '/^test/'d file3)、替换动作
    #替换第二行
    sed -i ‘2c\change’ testfile
    #替换每一行第一个匹配的字符串
    sed -i ‘s/hello/good/’ testfile
    #替换每一行所有匹配的字符串
    sed -i ‘s/hello/good/g’ testfile
    #-n选项和p命令一起使用表示只打印那些发生替换的行:
    sed -n 's/test/TEST/p' file
    定界符
    以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符
    sed 's:test:TEXT:g' 
    sed 's|test|TEXT|g'4)、查看动作
    #只查看文件的第3行到第9行
    # sed -n '3,9p' /var/log/yum.log
    # 所有在模板test和check所确定的范围内的行都被打印:
    sed -n '/test/,/check/p' file5)组合多个表达式
    sed '表达式' | sed '表达式' 等价于:sed '表达式; 表达式'
    引用
    sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。
    test=hello 
    echo hello WORLD | sed "s/$test/HELLO" 
    HELLO WORLD
    选定行的范围:,(逗号)
    所有在模板test和check所确定的范围内的行都被打印:
    sed -n '/test/,/check/p' 
    file打印从第5行开始到第一个包含以test开始的行之间的所有行:
    sed -n '5,/^test/p'
    file对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换:
    sed '/test/,/west/s/$/aaa bbb/' file6)、多点编辑:e命令 -e选项允许在同一行里执行多条命令: sed -e '1,5d' -e 's/test/check/' file上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。 和 -e 等价的命令是 --expression: sed --expression='s/test/check/' --expression='/love/d'7)、file从文件读入:r命令 file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面: sed '/test/r file' filename (8)、写入文件:w命令 在example中所有包含test的行都被写入file里: sed -n '/test/w file' example (9)、追加(行下):a\命令 将 this is a test line 追加到 以test 开头的行后面: sed '/^test/a\this is a test line' file在 test.conf 文件第2行之后插入 this is a test line: sed -i '2a\this is a test line' test.conf (10)、插入(行上):i\命令 将 this is a test line 追加到以test开头的行前面: sed '/^test/i\this is a test line' file在test.conf文件第5行之前插入this is a test line: sed -i '5i\this is a test line' test.conf (11)、下一个:n命令 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续: sed '/test/{ n; s/aa/bb/; }' file12)、变形:y命令 把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令: sed '1,10y/abcde/ABCDE/' file13)、 退出:q命令 打印完第10行后,退出sed sed '10q' file 保持和获取:h命令和G命令 在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。 sed -e '/test/h' -e '$G' file 在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。 (14)、保持和互换:h命令和x命令 互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换: sed -e '/test/h' -e '/check/x' file15)脚本scriptfile sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。 sed [options] -f scriptfile file(s)打印奇数行或偶数行 方法1: sed -n 'p;n' test.txt #奇数行 sed -n 'n;p' test.txt #偶数行 方法2: sed -n '1~2p' test.txt #奇数行 sed -n '2~2p' test.txt #偶数行 打印匹配字符串的下一行 grep -A 1 SCC URFILE sed -n '/SCC/{n;p}' URFILE awk '/SCC/{getline; print}' URFILE

    #############################################################
    [options]参数详解:
    -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
    -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
    -i :直接修改文件内容;
    -n :只打印模式匹配的行;
    -r :支持扩展表达式;
    -h或--help:显示帮助;
    -V或--version:显示版本信息。


    ‘script’参数详解
    a\ 在当前行下面插入文本;
    i\ 在当前行上面插入文本;
    c\ 把选定的行改为新的文本;
    d 删除,删除选择的行;
    D 删除模板块的第一行;
    s 替换指定字符;
    h 拷贝模板块的内容到内存中的缓冲区;
    H 追加模板块的内容到内存中的缓冲区;
    g 获得内存缓冲区的内容,并替代当前模板块中的文本;
    G 获得内存缓冲区的内容,并追加到当前模板块文本的后面;
    l 列表不能打印字符的清单;
    n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
    N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
    p 打印模板块的行。 P(大写) 打印模板块的第一行;
    q 退出Sed;
    b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;
    r file 从file中读行;
    t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
    T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾;
    w file 写并追加模板块到file末尾;
    W file 写并追加模板块的第一行到file末尾;
    ! 表示后面的命令对所有没有被选定的行发生作用;
    = 打印当前行号;
    # 把注释扩展到下一个换行符以前;
    ################################################################

    三、awk

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
    语法格式
    awk '{pattern + action}' {filenames}
    常用参数:
    -F 指定输入时用到的字段分隔符
    -v 自定义变量
    -f 从脚本中读取awk命令
    -m 对val值设置内在限制



    [root@localhost shell]# cat log.txt
    2 this is a test
    3 Are you like awk
    This's a test
    10 There are orange,apple,mongo

    awk脚本
    关于 awk 脚本,我们需要注意两个关键词 BEGIN 和 END。
    BEGIN{ 这里面放的是执行前的语句 }
    END {这里面放的是处理完所有的行后要执行的语句 }
    {这里面放的是处理每一行时要执行的语句}
    假设有这么一个文件(学生成绩表):

    $ cat score.txt
    Marry 2143 78 84 77
    Jack 2321 66 78 45
    Tom 2122 48 77 71
    Mike 2537 87 97 95
    Bob 2415 40 57 62
    我们的 awk 脚本如下:
    
    $ cat cal.awk
    #!/bin/awk -f
    #运行前
    BEGIN {
    math = 0
    english = 0
    computer = 0
    
    printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
    printf "---------------------------------------------\n"
    }
    #运行中
    {
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
    }
    #运行后
    END {
    printf "---------------------------------------------\n"
    printf " TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
    }
    #我们来看一下执行结果:
    
    $ awk -f cal.awk score.txt
    NAME NO. MATH ENGLISH COMPUTER TOTAL
    ---------------------------------------------
    Marry 2143 78 84 77 239
    Jack 2321 66 78 45 189
    Tom 2122 48 77 71 196
    Mike 2537 87 97 95 279
    Bob 2415 40 57 62 159
    ---------------------------------------------
    TOTAL: 319 393 350
    AVERAGE: 63.80 78.60 70.00   

     find

    find命令可以根据给定的路径和表达式查找的文件或目录。find参数选项很多,并且支持正则,功能强大。和管道结合使用可以实现复杂的功能,是系统管理者和普通用户必须掌握的命令。



    语法格式


    find path -option [ -print ] [ -exec -ok command ] {} \;

    print

    :表示将结果输出到标准输出。


    exec

    :对匹配的文件执行该参数所给出的shell命令。 

    形式为command {} \;,

    注意{}与\;之间有空格 


    ok

    :与exec作用相同,

          区别在于,在执行命令之前,都会给出提示,让用户确认是否执行 




    常用参数


    -name 按名称查找 |
    -iname 忽略大小写 |
    -size 按大小查找 |
    -user 按属性查找 |
    -type 按类型查找 |

    -perm  :按执行权限来查找


    -atime n : 在过去n天内被读取过的文件
    -ctime n : 在过去n天内被修改过的文件

    -empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
    -amin n : 在过去 n 分钟内被读取过
    -cmin n : 在过去 n 分钟内被修改过
    -anewer file : 比文件 file 更晚被读取过的文件
    -cnewer file :比文件 file 更新的文件
    -ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

    在/etc及其子目录中,查找host开头的文件 

    $ find /etc -name 'host*' -print  

    在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件   

    $ find . -perm 755 -print 

     查找用户有写权限或者组用户有写权限的文件或目录

    find ./ -perm /220
    find ./ -perm /u+w,g+w
    find ./ -perm /u=w,g=w

    find支持变量,查找$HOME变量目录下,24小时内修改过的文件。命令如下:

    find $HOME -mtime 0


    查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们:
    # find /var/log -type f -mtime +7 -ok rm {} \;



    使用-name参数查看/etc目录下面所有的.conf结尾的配置文件:


    [root@linuxcool ~]# find /etc -name "*.conf

    使用-size参数查看/etc目录下面大于1M的文件:


    [root@linuxcool ~]# find /etc -size +1M

    查找当前用户主目录下的所有文件:
    [root@linuxcool ~]# find $HOME -print

    列出当前目录及子目录下所有文件和文件夹:
    [root@linuxcool ~]# find .

    在/home目录下查找以.txt结尾的文件名:
    [root@linuxcool ~]# find /home -name "*.txt"

    在/var/log目录下忽略大小写查找以.log结尾的文件名:
    [root@linuxcool ~]# find /var/log -iname "*.log"

    搜索超过七天内被访问过的所有文件:
    [root@linuxcool ~]# find . -type f -atime +7

    搜索访问时间超过10分钟的所有文件:
    [root@linuxcool ~]# find . -type f -amin +10

    找出/home下不是以.txt结尾的文件:
    [root@linuxcool ~]# find /home ! -name "*.txt"   

    ps

    进程是运行的程序在系统中的存在形式,通过查看进程的状态信息,我们可以了解进程占用的系统资源情况,对系
    统的运行状态进行分析、调整,从而让系统保持在一个平稳的状态下运行。

    Linux中查看进程信息的基本命令有ps、top,其中ps(Process Status)查看的是进程信息的一个快照,显示的我们
    执行ps这个命令时进程的信息,top显示的是进程的动态信息,使用这个命令会看到进程信息的动态变化。


    F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;
    S 代表这个程序的状态 (STAT);
    (  常见的进程的 STAT 如下:
    R 运行 Runnable (on run queue) 正在运行或在运行队列中等待,
    S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号, 
      I  空闲 Idle ,
    Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放,
    D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生,
    T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行,
    P 等待交换页 ,
    W 无驻留页 has no resident pages 没有足够的记忆体分页可分配,
    X 死掉的进程 ,)

    进程

    状态后缀表示:

    <:优先级高的进程

    N:优先级低的进程

    L:有些页被锁进内存

    s:进程的领导者(在它之下有子进程)

    l:ismulti-threaded (using CLONE_THREAD, like NPTL pthreads do)

    +:位于后台的进程组

    PROCESS STATE CODES
    Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
    D uninterruptible sleep (usually IO)
    R running or runnable (on run queue)
    S interruptible sleep (waiting for an event to complete)
    T stopped by job control signal
    t stopped by debugger during the tracing
    W paging (not valid since the 2.6.xx kernel)
    X dead (should never be seen)
    Z defunct ("zombie") process, terminated but not reaped by its parent
    
    For BSD formats and when the stat keyword is used, additional characters may be displayed:
    
    < high-priority (not nice to other users)
    N low-priority (nice to other users)
    L has pages locked into memory (for real-time and custom IO)
    s is a session leader
    l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
    + is in the foreground process group

    USER :进程的所属用户,
    PID :进程的进程ID号, 
    %CPU :进程占用的 CPU资源 百分比,
    %MEM :进程占用的 物理内存 百分比, 
    VSZ :进程使用掉的虚拟内存量 (Kbytes) ,
    RSS :进程占用的固定的内存量 (Kbytes) ,
    TTY :与进程相关联的终端(tty),?代表无关,tty1-tty6是本机上面的登入者程序,pts/0表示为由网络连接进主机的程序。
    STAT :进程的状态,具体见2.1列出来的部分 ,
    START :进程开始创建的时间 ,
    TIME :进程使用的总cpu时间,
    COMMAND : 进程对应的实际程序。   

    perf

    perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。

    Perf List
    利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到
    程序性能的硬件事件或软件事件
    -----------------------------------------------------------------------------------------------------
    Perf top
    实时显示系统/进程的性能统计信息
    常用参数
    -e:指定性能事件
    -a:显示在所有CPU上的性能统计信息
    -C:显示在指定CPU上的性能统计信息
    -p:指定进程PID
    -t:指定线程TID
    -K:隐藏内核统计信息
    -U:隐藏用户空间的统计信息
    -s:指定待解析的符号信息

    ‘‐G’ or‘‐‐call‐graph’ <output_type,min_percent,call_order>

    graph: 使用调用树,将每条调用路径进一步折叠。这种显示方式更加直观。

    每条调用路径的采样率为绝对值。也就是该条路径占整个采样域的比率。

    fractal
    默认选项。类似与 graph,但是每条路径前的采样率为相对值。

    flat
    不折叠各条调用
    选项 call_order 用以设定调用图谱的显示顺序,该选项有 2个取值,分别是
    callee 与caller。
    将该选项设为callee 时,perf按照被调用的顺序显示调用图谱,上层函数被下层函数所调用。
    该选项被设为caller 时,按照调用顺序显示调用图谱,即上层函数调用了下层函数路径,也不显示每条调用路径的采样率

    注: Perf top需要root权限

    -----------------------------------------------------------------------------------------------------
    Perf stat
    分析系统/进程的整体性能概况
    task‐clock事件表示目标任务真正占用处理器的时间,单位是毫秒。也称任务执行时间
    context-switches是系统发生上下文切换的次数
    CPU-migrations是任务从一个处理器迁往另外一个处理器的次数
    page-faults是内核发生缺页的次数
    cycles是程序消耗的处理器周期数
    instructions是指命令执行期间产生的处理器指令数
    branches是指程序在执行期间遇到的分支指令数。
    branch‐misses是预测错误的分支指令数。
    XXX seconds time elapsed系程序持续时间
    任务执行时间/任务持续时间大于1,那可以肯定是多核引起的

    参数设置:
    -e:选择性能事件
    -i:禁止子任务继承父任务的性能计数器。
    -r:重复执行 n 次目标程序,并给出性能指标在n 次执行中的变化范围。
    -n:仅输出目标程序的执行时间,而不开启任何性能计数器。
    -a:指定全部cpu
    -C:指定某个cpu
    -A:将给出每个处理器上相应的信息。
    -p:指定待分析的进程id
    -t:指定待分析的线程id

    -----------------------------------------------------------------------------------------------------
    Perf record
    记录一段时间内系统/进程的性能时间
    参数:
     -e:选择性能事件
     -p:待分析进程的id
     -t:待分析线程的id
     -a:分析整个系统的性能
     -C:只采集指定CPU数据
     -c:事件的采样周期
     -o:指定输出文件,默认为perf.data
     -A:以append的方式写输出文件
     -f:以OverWrite的方式写输出文件
     -g:记录函数间的调用关系
    -----------------------------------------------------------------------------------------------------
    Perf Report
    读取perf record生成的数据文件,并显示分析数据
    参数
    -i:输入的数据文件
    -v:显示每个符号的地址
    -d <dos>:只显示指定dos的符号
    -C:只显示指定comm的信息(Comm. 触发事件的进程名)
    -S:只考虑指定符号
    -U:只显示已解析的符号
    -g[type,min,order]:显示调用关系,具体等同于perf top命令中的-g
    -c:只显示指定cpu采样信息
    -M:以指定汇编指令风格显示
    –source:以汇编和source的形式进行显示
    -p<regex>:用指定正则表达式过滤调用函数

    uptime

       uptime是一个简单获取系统总共运行多长时间,以及最近1分钟、5分钟、15分钟的平均负载。
    uptime通过/proc/uptime和/proc/loadavg获取相关信息。
    up前是当前系统时间,up后是系统运行时长。
    load average后是1分钟、5分钟、15分钟平均负载。
    11:15:41 up 82 days, 20:34, 8 users, load average: 0.28, 0.40, 0.43   

  • 相关阅读:
    实现Android ListView 自动加载更多内容
    Android中通过GPS或NetWork获取当前位置的经纬度
    android检测当前网络是否可用
    怎么样获得泛型T的Class对象?
    slidemenu
    linux mysql 操作命令
    解决Skyline 6.5版本中3DML模型单体化后外部网页挂接问题
    解决Skyline6.5多球对比时,自动运行TerraExplorer软件的问题
    OSGeo.OGR.Geometry
    TerraExplorer Add-ons 和TEZ使用说明
  • 原文地址:https://www.cnblogs.com/windyrainy/p/15106358.html
Copyright © 2020-2023  润新知