管道命令总结

管道命令

概念

         管道命令只会处理stdout,忽略stderr

         管道命令后面接的第一个数据必定是命令,这个命令必须能够接收stdin

双向重定向

         tee

                   用途:让stdout转存一份到文件内,并将同样的数据继续送到屏幕处理

                   tee [-a] file

                            a                不加a为>到file,加a为>>到file

[yc@yc temp]$ ls
1.txt
[yc@yc temp]$ cat 1.txt
aaaaa
bbbbb
ccccc
[yc@yc temp]$ cat 1.txt | tee -a tee.log | grep b
bbbbb
[yc@yc temp]$ ls
1.txt  tee.log
[yc@yc temp]$ cat tee.log
aaaaa
bbbbb
ccccc

关于减号-的用途

         用来替代stdin 和stdout

[yc@yc temp]$ ls
a  b
[yc@yc temp]$ ls a
1.txt  2.txt  3.txt
[yc@yc temp]$ ls b
[yc@yc temp]$ tar -cvf - a/ | tar -xvf - -C b/
a/
a/1.txt
a/2.txt
a/3.txt
a/
a/1.txt
a/2.txt
a/3.txt
[yc@yc temp]$ ls b/
a
[yc@yc temp]$ ls b/a/
1.txt  2.txt  3.txt

行的选取命令

  grep

                   用途:分析一行信息,如果当中有我们需要的信息,就将该行拿出来

                  grep [-A] [-B] [-acEinv] [--color=auto] '查找字符串' filename

                            -A            后跟数字n,表after,除了该行,列出其后n行

                            -B            后跟数字n,表before,除了该行,列出其前n行

                           a                将binary文件以text文件的方式查找数据

                            c                 计算找到'查找字符串'的次数

                            E                后跟扩展型正则表达式,一般用egrep代替,详见正则表达式

                            i                  忽略大小写

                            n                输出行号

                            v                 反向选择,即查找没有'查找字符串'的那一行

                            --color-auto               将找到的关键字颜色显示

# 查找特定字符串+显示行号
grep –n ‘the’ regular_express.txt

# 查找非特定字符串+不区分大小写
ps aux | grep -i tomcat | grep –v grep

# 将关键字所在行的前两行和后三行一起显示
dmesg | grep –n –A3 –B2 –color=auto 'eth'

                            更多grep命令例子见正则表达式

sed工具

         用途:对数据进行替换、删除、新增、选取特定行、直接修改文件内容

         sed [-nefr] [n1[,n2]] function

         sed –f [filename]

         set –i [n1[,n2]] function [filename]

                   n       安静模式,只有选取的那一行会被列出来

                   e       直接在命令行模式上进行sed的动作编辑

                   f        直接将sed的动作写在一个文件内,-f filename可以执行filename内的sed动作

                   r        sed的动作支持的是扩展型正则表达式的语法,默认基础型

                   i        直接修改读取的文件内容,而不是由屏幕输出

                   n1,n2        代表进行动作的行数,不加代表全部,加则比如10(第10行)或10,20(10-20行)

                   function

                            a       新增,后接字符串,字符串在新的一行出现,目前的下一行

                            c       替换,后接字符串,字符串替换n1和n2之间的行

                            d       删除,后不跟参数

                            i        插入,后跟字符串,字符串在新的一行出现,目前的上一行

                            p       打印,将选择的数据打印出来,通常与sed –n一起运行

                            s       替换,后跟正则表达式,替换字符与被替换字符都在动作内包含

# 删除第2~5行
nl /etc/passwd | sed '2,5d'

# 在第二行后面新增两行字
nl /etc/passwd | sed '2a Drink tea or[Enter]drink beer ?'
注:[Enter]为输入后按回车,即可表示新一行的开始’

# 替换第2~5行为”No 2-5 number”
nl /etc/passwd | sed '2,5c No 2-5 number'

# 查看第10~20行
nl /etc/passwd | sed '10,20p'

# 通过s得到目前主机的ip
ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'

# 直接删除空白行(不用cat、vim等打开该文件)
sed -i '/^[[:space:]]*$/d' /etc/passwd

# 直接替换文件内字符串(不用cat、vim等打开该文件,适用于大文件的替换)
sed –i 's/https://www.xxx.com:443/http://www.yyy.com/g' test.txt

行的排序命令

         sort

                   用途:依据不同的数据类型来排序

                   sort [-fbMnrtuk] [file or stdin]

                            f                 忽略大小写的差异

                            b                忽略最前面的空格符部分

                            M               以月份的名字来排序

                            n                以纯数字排序

                            r                 反向排序

                            t                 分隔符,默认使用[Tab]分隔

                            u                unique,相同的数据只出现一行代表

                            k                 以那个区间来进行排序

# 排序passwd,使用:做分隔符,使用第三列进行排序
cat /etc/passwd | sort -t ':' -k 3

行的统计命令

         wc

                   用途:统计多少字、多少行、多少字符

                   wc [-lwm]

                            l        仅列出多少行

                            w      仅列出多少字(英文单字)

                            m      仅列出多少字符

         uniq

                   用途:相同的数据,仅出现一行代表

                   特殊:可以计数

                   uniq [-ic]

                            i                 忽略大小写,等效于sort -fu

                            c                 进行计数

数据切割

  cut

                   用途:将一行信息的某一段切出来

                   缺点:处理多空格相连的数据比较差

                   cut -d '分隔字符' -f fields

                            -d               后面接分割字符,与-f一起使用

                            -f                依据-d将一段信息切割成数段,用-f取出第几段

# 取出PATH的第五个路径
echo $PATH | cut -d ':' -f 5

# 取出PATH的第三个和第五个路径
echo $PATH | cut -d ':' -f 3,5

                   cut -c 字符范围

                            -c               以字符为单位取出固定字符区间

# 取出每一行12个字符之后的所有字符
export|cut -c 12-

# 取出每一行第12~20之间的所有字符
export|cut -c 12-20

  xargs

                   用途:分别通过分割(-i)与分批(-n)行为产生某个命令的参数

                   接收stdin,以指定字符进行分隔,将stdin分成多个arguments

                   主要用于连接两个非管道命令

                   xargs [-0edpni] command

                            0                将stdin中的特殊字符(如`,等)还原为一般字符

                            e                后接字符串,表示分析到指定字符串的时候,停止分析(end of file)

                            d                指定分割字符,而不是默认的空格符

                            p                执行每个命令,都会询问用户

                            n                指定每次command使用几个参数

                            i                  不使用i只能传递到最后。使用-i后,可以使用{}指定将参数传递到哪,也可以多个

[yc@yc temp]$ cut -d ':' -f 1 /etc/passwd| sed -n '1,3p' | xargs -i id {}
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)
uid=2(daemon) gid=2(daemon) groups=2(daemon)

  awk

        用途:以列为单位将一行数据分隔成数个“字段”来处理

        awk ‘条件1{动作1} 条件2{动作2} ...’ filename

   内置变量(可更改)

                      NF   每一行$0拥有的字段总数

                      NR  目前awk所处理的是“第几行”数据

                      FS   目前的分隔字符,默认空格键

                      $0    代表一整行数据

                      $1    代表第一个字段

                      $2    代表第二个字段

                      ...    ...

               关键字

                      BEGIN   如果需要更改内置变量(如特殊的分隔字符),内置变量的更改默认情况下从第二行开始,使用BEGIN,代表从第一行之前就开始设置awk的内置变量,适用于特殊分隔字符+第一行也为所需要的数据的情况

                      END              同上,最后一行设置内置变量

        简单用法:列出某一个字段

# 列出目前活动的进程号(第二个字段)
ps aux | awk ‘{printf $2}’

        高级用法:通过指定条件筛选行与列来得到想要的数据

               使用内置变量+逻辑运算符筛选

                      显示有4个字段的一整行(NF+逻辑符+$0)

                             cat test.log | awk ‘NF==4{printf $0}’

                      显示第一行第二个和第四个字段+冒号:分隔符+printf简单定制(BEGIN+FS+NR+printf的单引号变双引号;空格变逗号)

                             cat test.log | awk ‘BEGIN {FS=”:”} NR==1{print “%s %s”,$2,$4}’

               使用自定义变量+内置变量+逻辑运算符+多条命令作一个动作对数据+printf高级定制进行运算(FS+NR+printf的单引号变双引号;空格变逗号;分行必须用 +一个动作中多条命令用;分隔+变量声明不能用declare -i)

      

                     得到每一行的分数总和

                            cat test.log | awk 'NR==1{printf "%s %s %s %s %s %s ",$1,$2,$3,$4,$5,"total"} NR>=2{total=$2+$3+$4;printf "%s %i %i %i %3.2f %i ",$1,$2,$3,$4,$5,total}'

         

                      得到某一列的分数和

                             declare -i second=0;cat test.log|awk 'NR>=2{second=(second+$3)} NR==4{printf "%i ",second}'

        

    高级awk用法

      https://www.cnblogs.com/emanlee/p/3327576.html

字符转换命令

         tr

                   用途:删除或替换一段信息当中的文字

                   tr [-ds] SET1 ...

                            无参数时进行替换操作

                            d                删除信息当中的SET1

                            s                 重复的SET1只用一个表示

[yc@yc temp]$ cat a.log
aab,bbc,ccd,dda
AAB,BBC,CCD,DDA
# 小写变大写
[yc@yc temp]$ cat a.log | tr '[a-d]' '[A-D]'
AAB,BBC,CCD,DDA
AAB,BBC,CCD,DDA
# 小写去重复
[yc@yc temp]$ cat a.log | tr -s '[a-d]'
ab,bc,cd,da
AAB,BBC,CCD,DDA
# 小写变大写去重复
[yc@yc temp]$ cat a.log | tr -s '[a-d]' '[A-D]'
AB,BC,CD,DA
AB,BC,CD,DA

         col

                   用途:将[Tab]按键替换为对等的空格键

                   经常用来将man page转存为纯文本文件以方便查阅

                   col [-xb]

                            x                 将[Tab]键转换为对等的空格键

                            b                文字内有/时,仅保留/最后接的那个字符

                            例

                                     cat /etc/man.confg|col -x| cat -A| more

                                     man col | col -b > /root/col.man

         join

                   用途:两个文件当中有相同数据的那一行加在一起

                   注意:两个文件最好事先经过排序(相同数据那一行)

                   join [-ti12] file1 file2

                            t                 指定分隔符号,默认空格符

                            i                  忽略大小写

                            1                指定第一个文件用那个字段来分析

                            2                制定第二个文件用哪个字段来分析

                            例

                                     将两个文件第一个字段相同者整成一行

                                              join -t ':' /etc/passwd /etc/shadow

                                     使用GID将两个文件整成一行

                                               join -t ':' -1 4 /etc/passwd -2 3 /etc/shadow

                                              注:结果GID会在第一列,其余列按顺序排列,相同的前几个字段不再出现

         paste

                   用途:将两个文件每一行都粘在一起,[TAB]键隔开,不进行匹配,只复制粘贴

                   paste [-d] file1 file2

                            d                后接分隔字符,默认[TAB]

         expand

                   将[TAB]键转换为空格键,可以自定义一个[TAB]键对应多少个字符

                   expand [-t] file

                            t                 后接数字,默认为8个

         unexpand

                   将空格转换为[Tab]键

                   unexpand [-at] file

                            a                转换所有空格

                            t                 后接数字,默认为8个

                   unexpand [--first-only] file              仅转换开头

文件的相关处理

printf(printf不是管道命令,因为常用与管道命令,所以总结到此)

         用途:将数据输出的结果格式化

         printf ‘打印格式’ 实际内容

                   a              警告声音退出

                                 退格键

                   f               清除屏幕

                                 输出新的一行

                                  [Enter]键

                                  水平的[Tab]键

                   v               垂直的[Tab]键

                   xNN         NN为两位数的数字,可以转换数字成为字符

                   常见的变量格式

                            %ns           n为数字,s为string,即多少个字符

                            %ni            n为数字,i为integer,即多少整数字数

                            %N.nf       n与N都是数字,f为float,如果有小数字数,%10,2f表示10个整数位,2个小数位

                   例

                            printf '%s %s %s %s %s ' $(cat test.txt)

                                     printf不是管道命令,只能用$()先执行获得stdout

                                     %s表任意长度的字符串, 表示制表位[Tab]

          

                            printf '%10s %5i %5i %5i %8.2f ' $(cat test.txt) |grep -v Name

                                     %10s表示10个长度的字符串

                                     %5i表示5个长度的整数

                                     $8.2f表示8个整数位,2个小数位的浮点数

          

                            printf 'x45 '

                                    列出十六进制45代表的字符--E

文件切割命令

         spilt

                   将一个大文件依据文件大小或行数来切割成为小文件

                   spilt [-bl] file PREFIX

                            b                后接欲切割的单位文件大小,可跟单位,b,k,m等

                            l                  后接欲切割的单位文件行数

                            PREFIX               代表前导符,表示切割成为的文件名字的前几个字符

                   例

                            cd /tmp ; spilt -b 300k /etc/termcap termcap

                                     得到termcapaa,termcapab,termcapac...

         切割文件的合并

                   cd /tmp ; cat termcap* >> termcapbak

sed其实也算文件处理

原文地址:https://www.cnblogs.com/yc913344706/p/7045873.html