zoukankan      html  css  js  c++  java
  • linux 管道相关命令(待学)

    1.1 cut

    cut:以某种方式按照文件的行进行分割

    参数列表

    -b 按字节选取 忽略多字节字符边界,除非也指定了 -n 标志

    -c 按字符选取

    -d 自定义分隔符,默认为制表符。

    -f 与-d一起使用,指定显示哪个区域。

    范围控制:

    n:只有第n项

    n-:从第n项一直到行尾

    n-m:从第n项到第m项(包括m)

    准备工作

    vim 1.txt

    111:aaa:bbb:ccc
    222:ddd:eee:fff
    333:ggg:hhh
    444:iii

     

    cat 1.txt | cut -c 1

     

    练习1 截取出1.txt文件中前2行的第5个字符

     

    答案:

    head -2 1.txt | cut -c 5

     

    练习2 截取出1.txt文件中前2行以”:”进行分割的第1,2段内容

     

    答案:

    head -2 1.txt | cut -d ':' -f 1,2

    或者

    head -2 1.txt | cut -d ':' -f 1-2

     

    练习3

    截取出1.txt文件中前2行以”:”进行分割的第1,2,3段内容

    答案:

    head -2 1.txt | cut -d ':' -f 1,2,3

    或者

     head -2 1.txt | cut -d ':' -f 1-3

     

    1.2 sort 的 工作原理

    1.2.1 基本使用

    sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

    [root@node01 tmp]# cat 01.txt
    banana
    apple
    pear
    orange
    pear

    [root@node01 tmp]# sort 01.txt
    apple
    banana
    orange
    pear
    pear

     

    1.2.2 sort的-u选项

    它的作用很简单,就是在输出行中去除重复行。

    [root@node01 tmp]# sort -u 01.txt 
    apple
    banana
    orange
    pear

     

    pear由于重复被-u选项无情的删除了。

    1. sort的-r 和 -n选项

    [root@node01 tmp]# cat 02.txt 
    1
    3
    5
    7
    11
    2
    4
    6
    10
    8
    9

     

    sort默认的排序方式是升序

    [root@node01 tmp]# sort 02.txt 
    1
    10
    11
    2
    3
    4
    5
    6
    7
    8
    9

     

    排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面

    [root@node01 tmp]# sort -n 02.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

     

    -r表示降序,n表示按数字进行排序

    [root@node01 tmp]# sort -n -r 02.txt
    11
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1

    合并式

    [root@node01 tmp]# sort -nr 02.txt  
    11
    10
    9
    8
    7
    6
    5
    4
    3
    2
    1

    1.3 wc命令

    wc命令用于计算字数。

    利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

    1.3.1 语法

    参数:

    • -c或--bytes或--chars 只显示Bytes数。

    • -l或--lines 只显示行数。

    • -w或--words 只显示字数。

    • --help 在线帮助。

    • --version 显示版本信息。

     

    1.3.2 准备工作

    111
    222 bbb
    333 aaa bbb
    444 aaa bbb ccc
    555 aaa bbb ccc ddd
    666 aaa bbb ccc ddd eee

     

    1.3.3 需求: 统计指定文件行数 字数 字节数

    在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。使用的命令为:

    wc 文件名 使用 wc统计,结果如下:

    [root@hadoop01 ~]# wc 01.txt     
    6 21 85 01.txt

    wc 01.txt       # 01.txt 文件的统计信息
    6 21 85 01.txt   # 01.txt文件: 行数为6, 单词数为 21, 字节数为 85
    其中,3 个数字分别表示 01.txt文件的行数、单词数,以及该文件的字节数。

     

     

    1.3.4 需求: 统计多个文件的 行数 单词数 字节数

    如果想同时统计多个文件的信息,例如同时统计01.txt 、02.txt 、03.txt,可使用如下命令:

    [root@hadoop01 ~]# wc 01.txt 02.txt 03.txt
    6 21 85 01.txt
    2   3 12 02.txt
    3   6 25 03.txt
    11 30 122 总用量

     

    1.3.5 需求: 查看 根目录下有多少个文件

    [root@hadoop01 ~]# ls /
    bin   cgroup etc   lib   lost+found misc net proc sbin     srv tmp var
    boot dev     home lib64 media       mnt   opt root selinux sys usr
    [root@hadoop01 ~]# ls / | wc -w
    23

     

    1.4 uniq

    uniq 命令用于检查及删除文本文件中重复出现的行,一般与 sort 命令结合使用。

    1 参数说明:

        -c 统计行数

    2 准备工作

    vim 5.txt

    张三    98
    李四    100
    王五    90
    赵六    95
    麻七    70
    李四    100
    王五    90
    赵六    95
    麻七    70

    3 练习1 去除5.txt中重复的行

     

    答案:

    cat 5.txt | sort | uniq

     

    4 练习2 统计5.txt中每行内容出现的次数

     

    答案:

    cat 5.txt | sort | uniq -c

     

    1.5 tee

    tee 和 >类似,重定向的同时还在屏幕输出 参数说明: tee -a 内容追加 和 >> 类似

    [root@hadoop01 tmp]# echo 'aaa' | tee 1.txt
    aaa

    [root@hadoop01 tmp]# cat 1.txt
    aaa

    [root@hadoop01 tmp]# echo 'bbb' | tee -a 1.txt
    bbb

    [root@hadoop01 tmp]# cat 1.txt
    aaa
    bbb

     

    练习1 统计5.txt中每行内容出现的次数输出到a.txt,并且把内容显示在控制台

     

    答案:

    sort 5.txt | uniq -c | tee a.txt

     

     

    练习2 统计5.txt中每行内容出现的次数输出追加到a.txt,并且把内容显示在控制台

     

     

    答案:

    sort 5.txt | uniq -c | tee -a a.txt

     

    1.6 tr

    Linux tr 命令用于转换或删除文件中的字符。 tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

    -d, --delete:删除指令字符

    练习1 把itheima的小写i换成大写I

     

    答案:

    echo "itheima" | tr 'i' 'I'

     

    练习2 把itheima的小写i和a换成大写I和A

     

    答案:

    echo "itheima" | tr 'i' 'I' | tr 'a' 'A'

     

    练习3 把itheima的转换为大写

     

    答案:

    echo "itheima" |tr '[a-z]' '[A-Z]'

     

    练习4 删除abc1d4e5f中的数字

     

    答案:

    echo 'abc1d4e5f' | tr -d '[0-9]'

     

    练习5 单词计数

    words.txt中的内容如下:
    hello,world,hadoop
    hive,sqoop,flume,hello
    kitty,tom,jerry,world
    hadoop

     

    cat words.txt | tr -s ',' '
    ' | sort | uniq -c | sort -r | awk '{print $2, $1}'

     

    脚本解释:

    tr -s ' ' ' '     表示:连续出现的空格只保留一个,并在空格处以换行符分割文本 tr -s ',' ' ' 表示 ,使用 tab代替

    sort 表示:对输出文本进行排序

     

    uniq -c 表示:对连续出现的重复的行进行计数

    sort -r 表示:对输出文本进行降序排序

    awk '{print $2, $1}' 表示:打印出文本的第二列和第一列

    1.7 split

    该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件 参数说明:     -b<字节> : 指定每多少字节切成一个小文件     -l<行数> : 指定每多少行切成一个小文件

     

    练习1 从/etc目录下查找以conf结尾的文件,并所有文件内容写入到v.txt

     

    答案:

    find /etc/ -type f -name "*conf" -exec cat {} >> v.txt ;

    [root@hadoop01 tmp]# rm -rf *

    [root@hadoop01 tmp]# ll

    总用量 0

    [root@hadoop01 tmp]# find /etc/ -type f -name "*conf" -exec cat {} >> v.txt ;

    [root@hadoop01 tmp]# ll

    总用量 420

    -rw-r--r--. 1 root root 429746 3月  17 23:15 v.txt

    [root@hadoop01 tmp]# wc v.txt

    12982  56922 429746 v.txt

     

     

    练习2 把v.txt进行分割

     

    答案:

    split v.txt

     

     

    练习3 把v.txt按2000进行分割

     

    答案:

    split -l 2000 v.txt

     

    练习4 把v.txt按10k进行分割

     

    答案:

    du –sh v.txt

    split -b 10k v.txt

     

    hadoop数据的划分, 这个是物理上真真实实的进行了划分,数据文件上传到HDFS里的时候,需要划分成一块一块,默认的每个块128MB。

    1.8 awk

    1.8.1 简介

    awk是一种处理文本文件的命令,是一个强大的文本分析工具。但是比较复杂,不过功能比sed更加的强大,它支持分段。默认每行按空格或TAB分割。

    1.1 选项参数说明:     -F 指定输入文件折分隔符

    1.8.2 默认分段

    默认每行按空格或TAB分割,使用$n来获取段号

    vim 1.txt

    aaa 111 333
    bbb 444 555
    ccc 666 777 888
    ddd 999 222 999

     

    练习1 创建1.txt,输入内容,打印出第1段

     

    答案:

    awk '{print $1}' 1.txt

     

    练习2 打印出1.txt的第1,2,3段

     

    答案:

    awk '{print $1,$2,$3}' 1.txt

     

    练习3 打印出1.txt的第1,2,3段,并且使用#号连接

     

    答案:

    awk '{print $1"#"$2"#"$3}' 1.txt

     

     

    1.8.3 段之间的连接符OFS

    练习1 

    打印1,2,3段,指定#为连接符

     

    答案:

    awk '{OFS="#"}{print $1,$2,$3}' 1.txt

     

    1.8.4 指定分隔符

    -F 来指定分隔符

    • 准备工作

    vim 2.txt

    aaa:111:333
    bbb:444:555
    ccc:666:777:888
    ddd:999:222:999:cccc

     

    练习1 

    打印出2.txt的第1段

     

    答案:

    awk -F ':' '{print $1}' 2.txt

     

    练习2 

    打印出2.txt的所有段

     

    答案:

    awk -F ':' '{print $0}' 2.txt

     

     

    练习3 

    打印出2.txt的第1,3段

     

    答案:

    awk -F ':' '{print $1,$3}' 2.txt

     

     

    1.8.5 内容匹配

    练习1 匹配2.txt中包含cc的内容

     

    答案:

    awk '/cc/' 2.txt

     

    练习2 

    匹配2.txt中第1段包含cc的内容

     

    答案:

    awk -F ':' '$1 ~ /cc/' 2.txt

     

     

    练习3 

    匹配2.txt中第1段包含至少连续两个c的内容

     

    答案:

    awk -F ':' '$1 ~ /cc+/' 2.txt

     

    练习4 

    在2.txt中如果匹配到aaa就打印第1,3段,如果匹配到ccc,就打印第1,3,4段

     

     

    答案:

    awk -F ':' '/aaa/ {print $1,$3} /ccc/ {print $1,$3,$4}' 1.txt

     

     

    练习5 

    在2.txt中如果匹配到aaa或者ddd,就打印全部内容

     

    答案:

    awk -F ':' '/aaa|ddd/ {print $0}' 2.txt

     

    1.8.6 段内容判断

    练习1 

    在2.txt中如果第3段等于222就打印所有内容

     

    答案:

    awk -F ':' '$3==222 {print $0}'  2.txt 

     

    练习2 

    在2.txt中如果第3段等于333就打印第一段

     

    答案:

    awk -F ':' '$3==333 {print $1}'  2.txt

     

    练习3 

    在2.txt中如果第3段大于等于300就打印第一段

    答案:

    awk -F ':' '$3>=300 {print $0}'  2.txt

     

    练习4 

    在2.txt中如果第5段不等于cccc就打印全部

     

    答案:

    awk -F ':' '$5!="cccc" {print $0}' 2.txt

     

    练习5 

    在2.txt中如果第1段等于ccc,并且第2段大于300就打印全部

     

    答案:

    awk -F ':' '$1=="ccc" && $2>300 {print $0}' 2.txt

     

    练习6 

    在2.txt中如果第1段等于ccc,并且第2段匹配666就打印全部

     

    答案:

    awk -F ':' '$1=="ccc" && $2==666 {print $0}' 2.txt

     

     

    1.8.7 段之间的比较

    练习1 

    在2.txt中如果第3段小于第4段就打印全部

     

    答案:

    awk -F ':' '$3<$4 {print $0}'  2.txt

     

    练习2 

    在2.txt中如果第2段等于第4段就打印全部

     

    答案:

    awk -F ':' '$2==$4 {print $0}' 2.txt

     

    1.8.8 NR行号和 NF段数

    练习1

    打印2.txt全部内容显示行号

     

    答案:

    awk -F ':' '{print NR " : " $0}'  2.txt

     

    练习2 

    打印2.txt全部内容显示段数

     

    答案:

    awk -F ':' '{print NF " : " $0}'  2.txt

     

    练习3 

    打印2.txt前2行,并显示行号 (用三种不同的方式实现)

     

    答案:

    nl 2.txt | head -2

    nl 2.txt | sed -n -e '1,2p'
       
    awk -F ':' 'NR<=2 {print NR " " $0}' 2.txt

     

    练习4 

    打印2.txt前2行,并且第1段匹配 aaa或者eee,打印全部,打印行号 (用两种方式)

     

    答案:

    nl 2.txt | head -2 | awk -F ':' '$1 ~ /aaa|eee/'

    或者

    awk -F ':' 'NR<=2 && $1 ~ /aaa|eee/ {print NR " " $0}'  2.txt

     

     

    练习5 从2.txt的前3行中匹配出第2段等于 666,并显示行号(用两种方式)

     

    答案:

    nl passwd | head -n 3 | awk -F ":" '$7=="/sbin/nologin" {print $0}'

    或者

    awk -F ':' 'NR<=3 && $2==666 {print $0}' 2.txt

     

    练习6 

    从2.txt前3行,把第1段内容替换为itheima,指定分隔符为|,显示行号(用两种方式)

     

    答案:

    nl 2.txt | head -3 | awk -F ':' '{OFS="|"} $1="itheima" {print NR "  " $0}'

    或者

    awk -F ':' '{OFS="|"} NR<=3 && $1="itheima" {print NR "  " $0}'  2.txt

     

    1.8.9 分段求和

    awk脚本,我们需要注意两个关键词BEGIN和END。 BEGIN{ 这里面放的是执行前的语句 } {这里面放的是处理每一行时要执行的语句} END {这里面放的是处理完所有的行后要执行的语句 }

    2.8.1 练习1 对2.txt中的第2段求和

     

    答案:

    awk -F ':' 'BEGING{}{total=total+$2}END{print total}'  2.txt

     

    1.8.10 综合练习

    练习1 

    对统计awk目录下所有文本文件的大小

     

    答案:

    ll | awk 'BEGIN{}{total=total+$5} END{print(total)}'

     

     

    练习2 打印99乘法表

     

    答案:

    awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%dx%d=%d%s", i, j, i*j, "	" )  } printf("
    ")  }  }'

    1.9 sed

    简介

    sed命令是来处理文本文件。sed也可以实现grep的功能,但是要复杂一些。 它的强大之处在于替换。并且对于正则也是支持的。

    • 参数说明:

      -n 仅显示处理后的结果 -e 以选项中指定的脚本来处理输入的文本文件 -f 以选项中指定的脚本文件来处理输入的文本文件

    • 动作说明:

      p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行 d :删除 a :新增,内容出现在下一行 i :插入, 内容出现在上一行 c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正规表示法! = :显示行号

    准备数据

    vim 1.txt

    aaa java root
    bbb hello
    ccc rt
    ddd root nologin
    eee rtt
    fff ROOT nologin
    ggg rttt

     

    1.9.1-n和p的组合:查找

    练习1

    查找01.txt中包含root行

     

    答案:

    sed -n -e '/root/p' 01.txt

     

     

    练习2

    查找出01.txt中包含一个或多个r,r后面是t,并显示行号

     

    答案:

    nl 01.txt | sed -nr -e '/r+t/p'

    或者

    sed -nr -e '/r+t/p' -e '/r+t/=' 01.txt

     

     

    练习3

    列出01.txt的第2行数据,并显示行号

     答案:

    nl 01.txt | sed -n -e '2p'

     

     

    练习4 列出01.txt的第2到第5行数据,并显示行号

    答案:

    nl 01.txt |sed -n -e '2,5p'        # 显示行号

     

     

    练习5 列出01.txt全部的数据,并显示行号

     

    答案:

    nl 01.txt
    cat -n 01.txt
    sed -n -e '1,$p' -e '1,$=' 01.txt

     

     

    练习6 

    列出01.txt中包含root的内容,root不区分大小写,并显示行号

     

    答案:

    nl 01.txt | sed -n -e '/root/Ip'

    nl 01.txt | grep -i root

    cat -n 01.txt | grep -i root

    1.9.2 d 删除

    练习1 

    删除01.txt中前3行数据,并显示行号

     

    答案:

    nl 01.txt | sed -e '1,3d'

    练习2 

    保留01.txt中前4行数据,并显示行号

     

    答案:

    nl 01.txt | sed -e '5,$d'

    1.9.3 a 和i 添加

        a:在行后面插入 (append)     i:在行前面插入 (insert)

    练习1:

    在01.txt的第二行后添加aaaaa,并显示行号

     

    答案:

    nl 01.txt | sed '2a aaaaa'

     

     

    练习2 

    在01.txt的第1行前添加bbbbb,并显示行号

     

    答案:

    nl 01.txt | sed -e '1i bbbbb'

    1.9.4 s和c替换

    s:对字符串进入替换  c:对行进行替换

    练习1 

    把01.txt中的nologin替换成为itheima,并显示行号

    答案:

    nl passwd | sed -e 's/nologin/itheima/'

    练习2 

    把01.txt中的1,2行替换为aaa,并显示行号

    答案:

    nl passwd | sed -e '1,2c aaa'

    1.9.5 对原文件进行操作

    注意:在进行操作之前,最好是对数据进行备份,放置操作失误,数据无法恢复!

    练习1 

    删除01.txt中前2行数据,并且删除原文件中的数据

    答案:

    sed -i -e '1,2d' 01.txt

    nl passwd 查看数据

    练习2 

    在01.txt中把nologin替换为itheima

    答案:

    sed -i -e 's/nologin/itheima/' 01.txt

    练习3 

    在01.txt文件中第2、3行替换为aaa

    答案:

    sed -i -e '2,3c aaa' 01.txt

    1.9.6 综合练习

    练习1 

    获取ip地址

    答案:

    ifconfig eth0 | grep 'inet addr:' | sed -e 's/^.addr://' | sed -e 's/Bcast.//'

    练习2 

    从01.txt中提出数据,删除前5行,并把nologin替换为itheima,并显示行号

    答案:

    nl 01.txt | sed -e '1,5d' | sed -e 's/nologin/itheima/'

    练习3 

    从01.txt中提出数据,匹配出包含root的内容,再把nologin替换为itheima

    答案:

    nl 01.txt | grep 'root' | sed -e 's/nologin/itheima/'

    或者

    nl 01.txt | sed -n -e '/root/p' | sed -e 's/nologin/itheima/'

    或者

    nl 01.txt | sed -n -e '/root/{s/nologin/itheima/p}' #只显示替换内容的行

     

  • 相关阅读:
    poj 1743 Musical Theme 后缀数组
    poj 1743 Musical Theme 后缀数组
    cf 432D Prefixes and Suffixes kmp
    cf 432D Prefixes and Suffixes kmp
    hdu Data Structure? 线段树
    关于position和anchorPoint之间的关系
    ios POST 信息
    CALayers的代码示例
    CALayers详解
    ios中得sqlite使用基础
  • 原文地址:https://www.cnblogs.com/mediocreWorld/p/11456203.html
Copyright © 2011-2022 走看看