数据流重定向和管道命令, grep, tr,sort, wc, cut,split,tee,sleep(shell 02)
主要内容
1.标准输入输出和错误
2.管道命令和 grep, tr,sort, wc, cut,split,tee,sleep
标准输入输出和错误
标准输入(stdin) 是指令数据的输入,代码为0,使用<或者<<,默认是键盘
标准输出(stdout)是指令执行成功返回的结果,代码为1,使用>或者>>,默认由屏幕显示
标准错误输出(stderr)是指令执行失败返回的错误信息,代码为2,使用2>或者2>>,默认是屏幕
< 指定输入的数据媒介来源
1> 将正确的内容 覆盖输出到指定的媒介
1>> 将正确的内容 追加到指定的媒介
2> 将错误信息覆盖输出到指定媒介
2>> 将错误信息追加输出到指定媒介
默认只能保存正确的
同时分类导出
[admin@localhost110 ~]$ rm -rf success fail result [admin@localhost110 ~]$ find /root a.txt 1>success 2>fail [admin@localhost110 ~]$ cat success /root a.txt [admin@localhost110 ~]$ cat fail find: “/root”: 权限不够 正确错误的均导入文件 [admin@localhost110 ~]$ find /root a.txt >result 2>&1
2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到a.txt中,最终结果就是标准输出和错误都被重定向到a.txt中
或者写成 find /root a.txt 1>>a.txt 2>a.txt
先写错误,后写正确的 所以 写正确的时候要用追加
[admin@localhost110 ~]$ cat result /root find: “/root”: 权限不够 a.txt [admin@localhost110 ~]$ find /root a.txt >result1 2>&1 [admin@localhost110 ~]$ find /root a.txt >result find: “/root”: 权限不够 [admin@localhost110 ~]$ find /root a.txt &>result2
&表示[012]
grep [a-z] -n <a.txt
替换
小写字母替换成大写字母
tr '[a-z]' '[A-Z]'<a.txt >a1.txt
ls -al|tr 'a-z' 'A-Z' 或者 ls -al|tr '[a-z]' '[A-Z]'
管道命令使用
命令通过管道符号|连接
能够接收标准输入(stdin),如tail/more/grep等
能够接收来自于前一个指令的数据成为stdin进行处理 只能处理正确的输出,不能处理错误的输出
ls -8|grep ls
处理不了
grep [-cinv] 'key' filename 支持正则
-c : 计算出现要查找字符的行数(是统计几行含有匹配的字符,并不是出现的次数)
-o :找出所有的要查找字符的匹配,一个1行
-i: 忽略大小写进行查找
-n: 输出行号
-v: 显示没有该字符的行 取反
-s:不显示不存在或无匹配文本的错误信息 忽略错误信息
-r: 递归遍历查找(比如在目录下递归查找文件内容)
-q:静默模式,不输出
[root@localhost110 ~]# cat log -n 1 php 2 ajax 3 java 4 python 5 nginx mysql 6 GO 7 PHP5 8 [root@localhost110 ~]# grep 'php' log php [root@localhost110 ~]# grep -n 'php' log 1:php [root@localhost110 ~]# grep -ni 'php' log 1:php 7:PHP5 [root@localhost110 ~]# grep -ci 'php' log 2 [root@localhost110 ~]# grep -inv 'php' log 2:ajax 3:java 4:python 5:nginx mysql 6:GO 8: [root@localhost110 ~]# grep -n [a-z] log 1:php 2:ajax 3:java 4:python 5:nginx mysql [root@localhost110 ~]# grep -nc [a-z] log 5 grep -n --color [a-z] log
统计当前登录用户
[root@localhost110 ~]# w 01:53:08 up 18:15, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.101 01:19 0.00s 0.24s 0.13s w [root@localhost110 ~]# w|grep -n root 3:root pts/0 192.168.1.101 01:19 0.00s 0.11s 0.00s w [root@localhost110 ~]# w|grep -nc root 1 不是root的 [root@localhost110 ~]# w|grep -v root 01:54:20 up 18:16, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
[root@centos1 ~]# cat 1.txt php 123php,php456 php [root@centos1 ~]# grep -o php 1.txt php php php php
[root@bogon sh]# echo 11|grep [0-9] 11 [root@bogon sh]# echo 11|grep [0-9] -q [root@bogon sh]# echo $? 0 [root@bogon sh]# echo abc|grep [0-9] [root@bogon sh]# echo $? 1
目标字符的后n行
-A2 表示 目标字符的后2行也显示出来 A表示after
-B2 表示 目标字符的前2行也显示出来 B表示before
-C2 上下2行
[root@bogon ~]# grep -A2 -n 'root' p.txt 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@bogon ~]# grep -B2 -n 'root' p.txt 1:root:x:0:0:root:/root:/bin/bash -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin [root@bogon ~]# grep -C2 -n 'root' p.txt 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin -- 8-halt:x:7:0:halt:/sbin:/sbin/halt 9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
在目录下遍历查找下面的文件
[root@bogon ~]# grep -r 'php' ./f ./f/t/1.txt:php5 ./f/t/1.txt:4php ./f/t/1.txt:js123php ./f/t/2.txt:php5 ./f/t/2.txt:4php ./f/t/2.txt:js123php ./f/a.php._mod:php ./f/a.php._mod:php2 ./f/a.php._mod:php4
grep中正则符号
* *前 任意数量个字符
. 匹配单个任意字符(字母,数字,下划线,空格)
? ?号之前的字符 0个或者1个 匹配时得 grep -E 或者 egrep
+ +1个或者多个 匹配时得 grep -E 或者 egrep
.* 贪婪匹配任意个数量的任意字符
abc|ef 匹配 abc或者ef
?,+都得egrep 或者grep -E
[root@bogon ~]# cat 1.txt root rt rut roooooot [root@bogon ~]# grep 'ro*t' 1.txt root rt roooooot 匹配指定个数的 比如匹配含有2个ou的 [root@bogon ~]# cat 1.txt rouououoooot rt rout rouout rouut [root@bogon ~]# grep 'r\(ou\)\{2\}' 1.txt rouououoooot rouout [root@bogon ~]# cat 1.txt rt rot root ro t [root@bogon ~]# grep 'ro?t' 1.txt [root@bogon ~]# grep -E 'ro?t' 1.txt rt rot [root@bogon ~]# egrep 'ro?t' 1.txt rt rot [root@bogon ~]# grep 'root|mysql' p.txt [root@bogon ~]# grep 'root\|mysql' p.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:#operator:/root:/sbin/nologin mysql:x:994:1003::/usr/local/mysql-5.6:/bin/bash [root@bogon ~]# grep -E 'mysql|root' p.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:#operator:/root:/sbin/nologin mysql:x:994:1003::/usr/local/mysql-5.6:/bin/bash [root@bogon ~]# egrep -E 'mysql|root' p.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:#operator:/root:/sbin/nologin mysql:x:994:1003::/usr/local/mysql-5.6:/bin/bash
sort指令
sort [-fbknrtu] filename
-f 忽略大小写
-b 忽略最前面的空格
-M 以月份英文字母排序
-n 使用数字排序
-r 逆向排序
-t 分隔符标识 默认是tab
-k 以第几列来排序
-u 删除重复的即使中间有间隔 注意与uniq区别
[root@localhost110 ~]# ls ab anaconda-ks.cfg a.php b.php composer.phar install.log install.log.syslog log mysql_listen.sh 公共的 模板 视频 图片 文档 下载 音乐 桌面 [root@localhost110 ~]# ls|sort ab anaconda-ks.cfg a.php b.php composer.phar install.log install.log.syslog log mysql_listen.sh [root@localhost110 ~]# ls|sort -r mysql_listen.sh log install.log.syslog install.log composer.phar b.php a.php anaconda-ks.cfg ab [root@localhost110 ~]# ls|sort ab anaconda-ks.cfg a.php A.php b.php B.php composer.phar D.php install.log install.log.syslog log mysql_listen.sh [root@bogon sh]# cat a.txt 11 10 0 8 7 2 1 4 5 3 6 9 2 2 3 3 [root@bogon sh]# cat a.txt |sort 0 1 10 11 2 2 2 3 3 3 4 5 6 7 8 9 [root@bogon sh]# cat a.txt |sort -n 0 1 2 2 2 3 3 3 4 5 6 7 8 9 10 11 [root@bogon sh]# cat a.txt |sort -nr 11 10 9 8 7 6 5 4 3 3 3 2 2 2 1 0 [root@bogon sh]# cat a.txt |sort -nr|uniq 11 10 9 8 7 6 5 4 3 2 1 0 [root@bogon sh]# cat a.txt |sort -nr|uniq -c 1 11 1 10 1 9 1 8 1 7 1 6 1 5 1 4 3 3 3 2 1 1 1 0
默认不区分大小写
按照文件大小写来排序
[root@localhost110 ~]# ls -l|sort -t ' ' -k 5 -n 总用量 1740 -rw-r--r--. 1 root root 6 10月 16 02:17 1 -rw-r--r--. 1 root root 6 10月 16 02:17 B.php -rw-r--r--. 1 root root 8 10月 16 01:59 a.php -rw-r--r--. 1 root root 11 10月 16 02:06 A.php -rw-r--r--. 1 root root 42 10月 16 01:42 log -rw-r--r--. 1 root root 140 10月 16 02:02 ab -rw-r--r--. 1 root root 143 10月 16 01:59 b.php -rwxrwxrwx. 1 root root 272 1月 27 2016 mysql_listen.sh -rw-r--r--. 1 root root 1112 10月 16 02:17 D.php -rw-------. 1 root root 1416 1月 13 2016 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 1月 13 2016 公共的 drwxr-xr-x. 2 root root 4096 1月 13 2016 模板 drwxr-xr-x. 2 root root 4096 1月 13 2016 视频 drwxr-xr-x. 2 root root 4096 1月 13 2016 图片 drwxr-xr-x. 2 root root 4096 1月 13 2016 文档 drwxr-xr-x. 2 root root 4096 1月 13 2016 下载 drwxr-xr-x. 2 root root 4096 1月 13 2016 音乐 drwxr-xr-x. 2 root root 4096 1月 13 2016 桌面 -rw-r--r--. 1 root root 10033 1月 13 2016 install.log.syslog -rw-r--r--. 1 root root 46328 1月 13 2016 install.log -rwxr-xr-x. 1 root root 1640731 6月 7 09:40 composer.phar
设置显示方式
export TIME_STYLE='+%Y-%m-%d %H:%M:%S'
[root@localhost110 ~]# ls -l|sort -k 6 总用量 1740 -rw-r--r--. 1 root root 10033 2016-01-13 17:42:57 install.log.syslog -rw-r--r--. 1 root root 46328 2016-01-13 17:48:20 install.log -rw-------. 1 root root 1416 2016-01-13 17:48:28 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 公共的 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 模板 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 视频 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 图片 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 文档 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 下载 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 音乐 drwxr-xr-x. 2 root root 4096 2016-01-13 17:52:58 桌面 -rwxrwxrwx. 1 root root 272 2016-01-27 05:54:08 mysql_listen.sh -rwxr-xr-x. 1 root root 1640731 2016-06-07 09:40:58 composer.phar -rw-r--r--. 1 root root 42 2016-10-16 01:42:05 log -rw-r--r--. 1 root root 8 2016-10-16 01:59:03 a.php -rw-r--r--. 1 root root 143 2016-10-16 01:59:45 b.php -rw-r--r--. 1 root root 140 2016-10-16 02:02:19 ab -rw-r--r--. 1 root root 11 2016-10-16 02:06:07 A.php -rw-r--r--. 1 root root 6 2016-10-16 02:17:17 1 -rw-r--r--. 1 root root 6 2016-10-16 02:17:21 B.php -rw-r--r--. 1 root root 1112 2016-10-16 02:17:30 D.php
wc指令
wc [-lwm] filename 统计功能
-l 统计行
-w 统计词
-m 统计字符
[root@localhost110 ~]# wc -l log 8 log [root@localhost110 ~]# cat log|wc -l 8 [root@localhost110 ~]# cat log|wc -w 10 [root@localhost110 ~]# cat log -n 1 php 2 ajax 3 java 4 python 5 nginx mysql 6 GO p erlang 7 PHP5 8 [root@localhost110 ~]# cat log|wc -m 53 [root@localhost110 ~]# cat log1|wc -m 12 [root@localhost110 ~]# cat log1 -n 1 p h p 2 1 2 3
[root@bogon sh]# cat 1.txt a b c [root@bogon sh]# wc 1.txt 2 3 6 1.txt 2行,3个单词,6个字符 [root@bogon sh]# cat -A 1.txt a$ b c$ [root@bogon sh]# wc -l 1.txt|cut -d ' ' -f1 2 取出行数
结尾算一个字符
tee与>
[root@bogon sh]# cat 1.txt a b c [root@bogon sh]# cat 1.txt|tee 11.txt a b c [root@bogon sh]# cat 1.txt>111.txt [root@bogon sh]# cat 11.txt a b c [root@bogon sh]# cat 111.txt a b c
tee重定向并输出
> 重定向 但影响正常输出了
tee到的内容 也是只有正确的内容写入
文件分割 split
[root@bogon ~]# seq 1 5 1 2 3 4 5 [root@bogon test]# for i in `seq 1 6000`;do cat /etc/passwd >>1.log;done; [root@bogon test]# du -sh 1.log 11M 1.log [root@bogon test]# wc -l 1.log 228000 1.log
按照大小和按照行分割
1.按照行分割
split -l 10000 1.log [root@bogon test]# ls |xargs wc -l 228000 1.log 10000 xaa 10000 xab 10000 xac 10000 xad 10000 xae 10000 xaf 10000 xag 10000 xah 10000 xai 10000 xaj 10000 xak 10000 xal 10000 xam 10000 xan 10000 xao 10000 xap 10000 xaq 10000 xar 10000 xas 10000 xat 10000 xau 10000 xav 8000 xaw 自定义命名 split -l 10000 1.log _ [root@bogon test]# ls 1.log _aa _ab _ac _ad _ae _af _ag _ah _ai _aj _ak _al _am _an _ao _ap _aq _ar _as _at _au _av _aw [root@bogon test]# ls _*|xargs -i mv {} {}.txt [root@bogon test]# ls 1.log _ab.txt _ad.txt _af.txt _ah.txt _aj.txt _al.txt _an.txt _ap.txt _ar.txt _at.txt _av.txt _aa.txt _ac.txt _ae.txt _ag.txt _ai.txt _ak.txt _am.txt _ao.txt _aq.txt _as.txt _au.txt _aw.txt -i 每个参数当一行 按照大小分割 [root@bogon test]# split -b 1M 1.log [root@bogon test]# du -sh * 11M 1.log 1.0M xaa 1.0M xab 1.0M xac 1.0M xad 1.0M xae 1.0M xaf 1.0M xag 1.0M xah 1.0M xai 1.0M xaj 648K xak
字串截取 cut
cut -d ':' -f 1 ./a
cut -d ':' -f 1,3,4 ./a
cut -d ':' -f 1-3 ./a
cut -c 2-5 ./a
cut -c 1 ./a
cut -c 1,3 ./a
[root@bogon ~]# cat a a:b:c:d:e:f a1:b1:c1:d1:e1:f1 a2:b2:c2:d2:d2:f2 a3:b3:c3:d3:e3:f3 [root@bogon ~]# cut -d ':' -f 1 ./a a a1 a2 a3 [root@bogon ~]# cut -d ':' -f 1,3,4 ./a a:c:d a1:c1:d1 a2:c2:d2 a3:c3:d3 [root@bogon ~]# cut -d ':' -f 1-3 ./a a:b:c a1:b1:c1 a2:b2:c2 a3:b3:c3 [root@bogon ~]# cut -c 2-5 ./a :b:c 1:b1 2:b2 3:b3 [root@bogon ~]# cut -c 1 ./a a a a a [root@bogon ~]# cut -c 1,3 ./a ab a: a: a:
杀掉所有php的进程
ps -ef|grep php|grep -v grep|cut -c 9-15|xargs kill -9
sleep
Ctrl+z (休眠到后台执行) Ctrl+c(杀死)
jobs 查看 任务列表
fg 编号 调到前台
调到后台后执行完毕在jobs里还有
fg到前台 执行完 jobs里才没有
fg 不加编号 优先回复 jobs里是+的任务
[root@bogon sh]# sleep 100 ^Z [1]+ 已停止 sleep 100 [root@bogon sh]# sleep 200 ^Z [2]+ 已停止 sleep 200 [root@bogon sh]# jobs [1]- 已停止 sleep 100 [2]+ 已停止 sleep 200 [root@bogon sh]# fg 1 sleep 100
单引号,双引号,反引号
[root@bogon sh]# echo $a modify_suffix.sh.tar.gz [root@bogon sh]# b="echo $a" [root@bogon sh]# echo $b echo modify_suffix.sh.tar.gz [root@bogon sh]# b=`echo $a` [root@bogon sh]# echo $b modify_suffix.sh.tar.gz
.=source 加载配置文件
. /etc/profile
source /etc/profile
还有 join/paste等