linux学习笔记9-输出输入重定向
linux学习笔记9-输出输入重定向
unix ken tompsan 准则:一次只做一件事,并且做好。但是这只适用于目标明确且单一的情况。
后面又有了另一个准则,doug mcllroyme美国工程院院士,计算机大师,扩展到,能够与其他程序协同工作,并且能处理文本流。
让linux程序之间协同工作需要用到:
Redirection 重定向(输入输出重定向)和 pipe管道
stdin 标准输入 0
stdout 标准输出 1
stderr 标准错误输出 2
输出重定向
linux使用 > 和 >>来重定向标准输入
ls -l ./example/ >result.txt
把example目录的文件列表输出到result.txt文件中
如果result.txt文件不存在,会被创建。如果已经存在,则会被覆盖。
如果把 > 改为 >>,则新的输出结果会追加到之前存放结果的文件中,并不会覆盖。
接上个命令
ls -l ./ >>result.txt
把当前目录的文件列表追加输出到刚才的result.txt文件中
还可以分别把正确和错误的输出结果做2个分开的保存
例如当前目录只有 file01-file03 文件
ll ./file01 ./file02 ./file03 ./file04 1>./stdout.txt 2>./stderr.txt
[stu@localhost example]$ cat stderr.txt
ls: 无法访问file04: 没有那个文件或目录
[stu@localhost example]$ cat stdout.txt
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file01
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file02
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file03
还可以把正确和错误的输出存到同一个文件里面
例如当前目录只有 file01-file03 文件
[stu@localhost example]$ ll file04 file01 file02 file03 &>result.txt
[stu@localhost example]$ cat result.txt
ls: 无法访问file04: 没有那个文件或目录
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file01
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file02
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file03
结合回显命令echo把回显内容直接输出到文件里面其中 -e选项是输出转义字符,其中 \n 代表回车;-n参数代表显示行号
[stu@localhost example]$ echo -e "1 apple\n2 pear\n3 banana"
1 apple
2 pear
3 banana
[stu@localhost example]$ echo -e "1 apple\n2 pear\n3 banana">fruit.txt
[stu@localhost example]$ cat -n fruit.txt
1 1 apple
2 2 pear
3 3 banana
使用重定向来忽略错误的输出,把错误的输出丢弃到“系统黑洞”
例如当前目录只有 file01-file03 文件
[stu@localhost example]$ ll file01 file02 file03 file04 2>/dev/null
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file01
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file02
-rw-rw-r--. 1 stu stu 0 1月 6 20:48 file03
其中/dev/null文件是 系统黑洞,被输出到这个文件的内容都被丢弃,查看命令看不到里面有任何内容
输入重定向
让系统从指定的文件中获得输入,而不是从键盘中
< 和<<
[stu@localhost example]$ cat fruit.txt
1 apple 2 pear 3 banana
[stu@localhost example]$ tr '\t' '\n'<fruit.txt
1 apple
2 pear
3 banana
tr命令表示从标准输入中替换特定字符并把结果给到标准输出。
tr【将被替换掉的字符】【新的字符】
此例中表示把\t 换为\n以后再输出结果。
sort -k【关键字字段序号】【要排序的文本文件】
一种特殊的输入重定向叫 Here Document,将输入重定向到一个交互式 Shell 脚本或程序。下面例子中的<<【特定词】,sort -k2表示对文本文件中第2列的值根据ASC码进行重排。
[stu@localhost ~]$ sort -k2 <<EOF
D 2
F 1
V 4
D 6
> EOF(要顶格写,前面不能有任何字符或空格)
F 1
D 2
V 4
D 6
[stu@localhost ~]$ sort -k2 <<ok
> a 9
> a 8
> a 7
> a 1
> a 3
> a 6
> ok
a 1
a 3
a 6
a 7
a 8
a 9
其中EOF表示 End Of File,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。
管道操作
命令1的输出作为命令2的输入,命令2的输出作为命令3的输入,需要注意的是,后面的命令如果要接受前面的输出结果作为输入的话,需要后面的命令能够接收标准数据流作为输入,这样一来基本上都是文字处理类的命令比较容易做管道,grep cut head tail less more wc tr sort
ll /etc|less 把etc目录的内容列出并且用less命令查看
grep命令 是文本查找命令,用法:grep 【关键字】【目标文件】
ll /etc|grep 'ssh' 在etc目录中查找有ssh关键字的文件或目录
cut命令 是文本切割命令,用法1: cut -c1,2 把文本按照列来切分,保留第1和2列
cat ~/install.log|cut -c1,2 把安装日志的前2列的字符切出来,结果全部是“安装”,结果数量太多就不贴实际代码和结果了
用法2:cut -f1 -d ,-f表示切割的字段号,-d表示按什么符号来切割
cat /etc/passwd|cut -f1 -d":" 表示在passwd文件的第一个字段中,按照:符号来切割文本
下面是切割前和切割后的对比
切割前:
[root@localhost stu]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
切割后:
[root@localhost stu]# cat /etc/passwd|cut -f1 -d":"
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
wc命令,作用是文本统计word count
[root@localhost stu]# wc /etc/passwd
40 68 1986 /etc/passwd
# 其中40代表行数,68代表单词数,1986是字节数(在以下命令中印证)
[root@localhost stu]# ll /etc/passwd
-rw-r--r--. 1 root root 1986 1月 12 17:54 /etc/passwd
[root@localhost stu]# cat -n /etc/passwd
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
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin
13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15 nobody:x:99:99:Nobody:/:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
17 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
18 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
20 rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
21 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
22 abrt:x:173:173::/etc/abrt:/sbin/nologin
23 apache:x:48:48:Apache:/var/www:/sbin/nologin
24 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
25 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
26 haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
27 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
28 ntp:x:38:38::/etc/ntp:/sbin/nologin
29 saslauth:x:498:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
30 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
31 pulse:x:497:495:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
32 tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat6:/sbin/nologin
33 webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
34 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
35 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
36 oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
37 tcpdump:x:72:72::/:/sbin/nologin
38 stu:x:500:500:student:/home/stu:/bin/bash
39 yt:x:501:501::/home/yt:/bin/bash
40 nbstu01:x:601:502:linux服务器管理慕课用户01:/tmp/stu01:/bin/bash
用法1:wc -l 仅仅统计行数
统计当前目录下文件夹的数量:ll ~|cut -c1|grep "d"|wc -l
ll ~|cut -c1|grep "d"|wc -l
[root@localhost stu]# ll .
总用量 474492
-rwxrw-r--. 1 stu stu 408956944 12月 9 2019 441.66-quadro-desktop-notebook-win8-win7-64bit-international-whql.exe
-rw-------. 1 stu stu 2523 1月 12 15:54 Centos-7.repo
-rw-r--r--. 1 root root 1991 1月 12 16:26 CentOS-Base.repo.bak
-rw-r--r--. 1 root root 15230 2月 7 16:40 etc.txt
drwxrwxr-x. 2 stu stu 4096 1月 6 21:53 example
-rw-rw-r--. 1 stu stu 76835880 1月 26 19:55 opera-stable_83.0.4254.27_amd64.rpm
-rw-rw-r--. 1 stu stu 143 1月 7 11:41 poem.txt
-rw-rw-r--. 1 stu stu 156 1月 6 21:15 stderr.txt
-rw-rw-r--. 1 stu stu 56 1月 6 21:15 stdout.txt
drwxrwxr-x. 3 stu stu 4096 1月 12 15:27 tmp
-rw-rw-r--. 1 stu stu 195 1月 8 11:24 turtle.txt
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 公共的
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 模板
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 视频
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 图片
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 文档
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 下载
drwxr-xr-x. 2 stu stu 4096 12月 28 16:27 音乐
drwxr-xr-x. 2 stu stu 4096 1月 5 09:27 桌面
[root@localhost stu]# ll .|cut -c1|grep "d"|wc -l
这个例子是4个命令的管道,很好体现了linux程序设计的思想,即:
1,一次只做一件事,并且做到最好;
2,程序之间能够协同工作;
3,能够处理文本流
但是,管道不会传递错误输出
ll /bin /sbni |wc -l 本意是把bin和sbin两个目录的文件数量做统计,但是sbin目录名字输错了,被写成了sbni,此时错误信息不会进入管道,会直接显示出来
[root@localhost stu]# ll /bin /sbin |wc -l
416
[root@localhost stu]# ll /bin /sbni |wc -l #此时只传递了正确的输出,错误信息直接回显了
ls: 无法访问/sbni: 没有那个文件或目录
124
# 如果不想让程序输出错误信息,可以把错误输出重定向到dev/null
[root@localhost stu]# ll /bin /sbni 2>/dev/null|wc -l
124
# 此时第一个命令执行后的错误信息被抛弃,正确的信息作为输入进入了管道