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
# 此时第一个命令执行后的错误信息被抛弃,正确的信息作为输入进入了管道
posted @ 2022-01-06 22:01  ytytytyt  阅读(120)  评论(0)    收藏  举报