cut

cut命令可以从一个文本文件或者文本流中提取文本列:

  • 若有特定分隔符:cut -d'分隔字符' -f fields,以分隔符分割并取出第fields
    • -d,delimiters
    • -f,fregment
  • 若排列整齐:cut -c 字符区间,以字符 (characters) 的单位取出固定字符区间
    • -c,characters

例:PATH 变量如下:

123 [root@www ~]# echo $PATH/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games# 1 | 2 | 3 | 4 | 5 | 6 | 7


将 PATH 变量取出,我要找出第五个路径:

12 #echo $PATH cut -d ‘:’ -f 5/usr/local/bin


将 PATH 变量取出,我要找出第三和第五个路径:

12 #echo $PATH cut -d ‘:’ -f 3,5/sbin:/usr/local/bin


将 PATH 变量取出,我要找出第三到最后一个路径:

12 echo $PATH | cut -d ‘:’ -f 3-/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games


将 PATH 变量取出,我要找出第一到第三个路径:

查看/etc/passwd,只显示其中的用户及其默认使用的shell解析器

12345678910111213141516171819202122232425262728293031323334353637383940414243 [root@mini01 shell]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinvcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologinsaslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin[root@mini01 shell]# cat /etc/passwd | cut -d ‘:’ -f 1,7root:/bin/bashbin:/sbin/nologindaemon:/sbin/nologinadm:/sbin/nologinlp:/sbin/nologinsync:/bin/syncshutdown:/sbin/shutdownhalt:/sbin/haltmail:/sbin/nologinuucp:/sbin/nologinoperator:/sbin/nologingames:/sbin/nologingopher:/sbin/nologinftp:/sbin/nologinnobody:/sbin/nologindbus:/sbin/nologinvcsa:/sbin/nologinsaslauth:/sbin/nologinpostfix:/sbin/nologinsshd:/sbin/nologin

sort

命令对file参数指定的文件或标准输入流中的行排序,并将结果写到标准输出。如果file参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

  • -t指定域分隔符
  • -k指定按第几个列排序
  • -n按照纯数字排序(默认以文本形式按照字典序排序)
  • -r逆序,reverse
  • -u去重,unique

查看/etc/passwd并以用户名排序:

123456789 [root@mini01 shell]# cat /etc/passwd | sortadm:x:3:4:adm:/var/adm:/sbin/nologinbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologin…


以用户ID排序(即每行以冒号分隔的第三列排序):

123456789 [root@mini01 shell]# cat /etc/passwd | sort -t ‘:’ -k 3 -nroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown…


/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序:

123456 cat /etc/passwd | sort -t’:’ -k 6.2,6.4 -k 1r sync:x:4:65534:sync:/bin:/bin/syncproxy:x:13:13:proxy:/bin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/sh…

uniq

uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。
例:testfile的内容如下

1234567 cat testfilehelloworldfriendhelloworldhello


未经排序时使用uniq没有效果:

1234567 uniq testfile helloworldfriendhelloworldhello


排序并去重:

1234 cat testfile | sort |uniqfriendhelloworld


排序之后删除重复行,同时在行首位置输出该行重复的次数:

1234 sort testfile | uniq -c1 friend3 hello2 world

wc

123456 [root@mini01 shell]# wc —help用法:wc [选项]… [文件]…输出每个指定文件的行数、单词计数和字节数 -m, —chars 输出字符数统计 -l, —lines 输出行数统计 -w, —words 显示单词计数

sed

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

删除-d

  • sed '2d' example—–删除example文件的第二行。
    • 加上-i则将修改后的内容覆盖源文件
  • sed '2,$d' example—–删除example文件的第二行到末尾所有行。
  • sed '$d' example—–删除example文件的最后一行。
  • sed '/test/'d example—–删除example文件所有包含test的行。

    替换-s

  • sed 's/test/mytest/g' example—–在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

  • sed -n 's/^test/mytest/p' example—–(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
  • sed 's/^192.168.0.1/&localhost/' example—–&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost
  • sed -n 's/\(love\)able/\1rs/p' example—–love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
  • sed 's#10#100#g' example—–不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

    选定行的范围-逗号

  • sed -n '/test/,/check/p' example—–所有在模板test和check所确定的范围内的行都被打印。

  • sed -n '5,/^test/p' example—–打印从第五行开始到第一个包含以test开始的行之间的所有行。
  • sed '/test/,/check/s/$/sed test/' example—–对于模板test和west之间的行,每行的末尾用字符串sed test替换。

    多点编辑-e

  • sed -e '1,5d' -e 's/test/check/' example—–(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

  • sed --expression='s/test/check/' --expression='/love/d' example—–一个比-e更好的命令是–expression。它能给sed表达式赋值。

    awk

    是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格和Tab为默认分隔符将每行切片,切开的部分再进行各种分析处理。如查看最近5次登陆的用户:
1234567891011121314 [root@mini01 shell]# last -n 5root pts/1 192.168.25.2 Fri Jun 7 19:43 - 19:44 (00:00)root pts/0 192.168.25.2 Fri Jun 7 19:20 still logged inreboot system boot 2.6.32-573.el6.x Fri Jun 7 19:19 - 00:51 (05:32)root pts/0 192.168.25.2 Fri Jun 7 02:33 - 04:54 (02:20)reboot system boot 2.6.32-573.el6.x Fri Jun 7 02:23 - 00:51 (22:28)wtmp begins Thu Jun 6 17:35:18 2019[root@mini01 shell]# last -n 5 | awk ‘{print $1}’rootrootrebootrootreboot


每行都会执行action : {print $1}
awk中同时提供了printprintf两种打印输出的函数:

  • print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
  • printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂

-F指定分隔符,只显示/etc/passwd的账户:

123456 cat /etc/passwd |awk -F ‘:’ ‘{print $1}’ rootdaemonbinsys…


显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以Tab键分割:

12345 cat /etc/passwd |awk -F ‘:’ ‘{print $1”\t”$7}’root /bin/bashdaemon /bin/shbin /bin/shsys /bin/sh


显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"

12345678 cat /etc/passwd |awk -F ‘:’ ‘BEGIN {print “name,shell”} {print $1”,”$7} END {print “blue,/bin/nosh”}’name,shellroot,/bin/bashdaemon,/bin/shbin,/bin/shsys,/bin/sh….blue,/bin/nosh

awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

搜索/etc/passwd有root关键字的所有行:

12 awk -F: ‘/root/‘ /etc/passwdroot:x:0:0:root:/root:/bin/bash

匹配了pattern(这里是‘/root/’)的行才会执行action(没有指定action,默认输出每行的内容)。搜索支持正则

搜索/etc/passwd有root关键字的所有行,并显示对应的shell:

12 awk -F: ‘/root/{print $7}’ /etc/passwd /bin/bash

————————————————

原文链接:https://zhenganwen.top/posts/b7d1c81d/