重定向及管道
程序 = 指令 + 数据
数据: 输入/输出数据
每打开一个文件都会有一个文件描述符fd
输入输出
标准输入
标准输出 1
标准错误输出 2
输出重定向
> 覆盖重定向
>> 追加重定向
2> 覆盖重定向错误输出流
2>> 追加重定向错误输出流
简而言之:输入重定向就是把文件导入到命令中,而输出重定向就是把原本要输入到屏幕的数据写到指定的文件中去。
其中,输出重定向包括标准输出重定向和错误输出重定向以及**清空写入与追加写入两种模式**。
标准输入重定向:(STDIN,文件描述为0):默认从键盘输入,也可以从其他文件或者命令输入。
标准输出重定向:(STDOUT,文件描述为1):默认输出到屏幕
错误输出重定向:(STDERR,文件描述为2):默认输出到屏幕。
**
[root@test tmp]# echo "hello eagles" #输出到屏幕上<br /> hello eagles<br /> [root@test tmp]# echo "hello eagles" > 2.txt #输入到指定的2.txt文件中<br /> [root@test tmp]# cat 2.txt **查看2.txt文件**<br /> hello eagles<br /> [root@test tmp]# echo "hello eagles" >> 2.txt #将**标准输出重定**向到一个文件中(追加到原有的内容后面)<br /> [root@test tmp]# cat 2.txt <br /> hello eagles<br /> hello eagles #看到追加一行代码<br /> [root@test tmp]# lnd 指令输入到文件中<br /> -bash: lnd: command not found<br /> [root@test tmp]# lnd 2> output_error #错误输出重定向到文件中<br /> [root@test tmp]# cat output_error <br /> -bash: lnd: command not found<br /> [root@test tmp]# lnd 2>> output_error<br /> [root@test tmp]# cat output_error <br /> -bash: lnd: command not found<br /> -bash: lnd: command not found<br />标准输出和错误输出到各自不同的位置<br />[root@test tmp]# ll 1> file.out 2> file_error.out** #ll=ls -l查看详细信息,命令写入文件file.out 2**<br />[root@test tmp]# cat file.out 查看<br />total 8<br />lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt **#1表示inode的引用次数,5表示文本字节大小,->表示这个是谁的软链接 !!!**<br />-rw-r--r--. 1 root root 0 Feb 6 07:26 1.txt<br />-rw-r--r--. 1 root root 26 Feb 6 07:51 2.txt<br />-rw-r--r--. 1 root root 0 Feb 6 07:53 file_error.out<br />-rw-r--r--. 1 root root 0 Feb 6 07:53 file.out<br />-rw-r--r--. 1 root root 60 Feb 6 07:51 output_error<br />[root@test tmp]# lld 1> file.out 2> file_error.out<br />[root@test tmp]# cat file_error.out <br />-bash: lld: command not found<br />**垃圾桶: /dev/null 类似于windows的回收站 无限大**<br />**合并标准输出和错误输出为同一数据流进行重定向,将错误输出与标准输出共同写入到文件中,并且追加到原有的内容之后。**<br />**两种写法:**
- 命令&>>文件
[x] 命令>>文件2>&1
&> :覆盖重定向错误流
&>>: 追加重定向正确流
2>&1: 将错误流重定向到标准输出文件中 (>>)
1>&2 : 将正确流重定向到错误输出文件中 (>>)[root@test tmp]# lld &> all.out #覆盖重定向
[root@test tmp]# ll &>> all.out #追加重定向
[root@test tmp]# cat all.out
-bash: lld: command not found
total 16
lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt
-rw-r—r—. 1 root root 0 Feb 6 07:26 1.txt
-rw-r—r—. 1 root root 26 Feb 6 07:51 2.txt
-rw-r—r—. 1 root root 30 Feb 6 07:56 all.out
-rw-r—r—. 1 root root 30 Feb 6 07:53 file_error.out
-rw-r—r—. 1 root root 0 Feb 6 07:53 file.out
-rw-r—r—. 1 root root 60 Feb 6 07:51 output_error
[root@test tmp]# lld 1> file.out 2> file_error.out 2>&1
#lld命令标准输出到file.out文件中,将错误流重定向到标准输出文件中,最后合并输出重定向到文件中追加模式。
[root@test tmp]# cat file.out
-bash: lld: command not found
[root@test tmp]# ll 1> file.out 2> file_error.out 1>&2
#ll标准输入重定向到文件file.out中在错误输出重定向到文件中,最后将正确流重定向输入到错误输出文件中
[root@test tmp]# cat file_error.out
total 16
-rw-r—r—. 1 root root 30 Feb 6 07:57 1.out
lrwxrwxrwx. 1 root root 5 Feb 6 07:26 1_soft.txt -> 1.txt
-rw-r—r—. 1 root root 0 Feb 6 07:26 1.txt
-rw-r—r—. 1 root root 26 Feb 6 07:51 2.txt
-rw-r—r—. 1 root root 396 Feb 6 07:56 all.out
-rw-r—r—. 1 root root 0 Feb 6 07:59 file_error.out
-rw-r—r—. 1 root root 0 Feb 6 07:59 file.out
-rw-r—r—. 1 root root 60 Feb 6 07:51 output_error #追加重定向正确流标准输入(实际基本不用)
覆盖:
cat > /path/somefile <….
EOF
追加:
cat >> /path/somefile <….
EOF
cat > test.txt <hello eagles
hello Linux
EOF
cat >> test.txt <hello eagles
hello Linux
EOF管道
command1 | command2 | command3 …
最后一个命令会在当前shell进程的子shell进程中执行;前一个命令的执行结果
会由当前命令继续使用
tr命令:
Usage: tr [OPTION]… SET1 [SET2]
常用选项:
-d: 删除
案例1:将/etc/passwd文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中
[root@node1 ~]# head ‐n 5 /etc/passwd | tr ‘a‐z’ ‘A‐Z’ > /tmp/passwd.output
案例2:将登陆至当前系统上用户信息中的最后1行的信息转换为大写后保存至/tmp/who.out文件中
[root@node1 ~]# who | tail ‐n 1 | tr ‘a‐z’ ‘A‐Z’ >/tmp/who.out
tail可以持续刷新一个文件的内容,可以查看最新的日志文件。-n查最后一行就是可以查看最新的日志文件,接着信息转变为大写输入到/tmp/who.out文件中。
案例3:将文件中的:删除之后重定向到新文件中
[root@test tmp]# cat output_error | tr -d “:” > output_error_new
查阅output_error文件 并且tr -d 表示删除一个字符 再重新输入到文件中。
wc命令:统计文本的行数、字数还有字节数
Usage: wc [OPTION]… [FILE]…
[root@test tmp]# wc test.txt
4 8 50 test.txt —->4行 8个字数 字节50个
常用参数:
-l : 行数
-w : 单词数
-c :字符数
[root@test tmp]# wc -l test.txt 查看文本的行数
4 test.txt
[root@test tmp]# wc -w test.txt 查看单词数
8 test.txt
[root@test tmp]# wc -c test.txt 查看字符数
50 test.txt
cut命令:
[root@test tmp]# cut —help
Usage: cut OPTION… [FILE]…
Print selected pa**rts of lines from each FILE to standard output.
常用参数:
-d: 指定分隔符
-f: 指定字段
实例: 以:为分隔符显示第7列内容
[root@test tmp]# cut -d: -f7 passwd.output 一定要有分隔符号:
sort命令
常用参数:
-f: 忽略大小写
-r:逆序
-t:字段分隔符
-k #: 以指定字段为标准排序
-n: 以数字进行排序(默认情况下,如果没有-n参数,会以ASCII进行排序)
-u: 排序后进行去重
实例: 以:为分隔符,指定第3字段,以数字进行逆序
[root@test tmp]# sort -t: -k3 -r -n passwd.output
uniq命令:去重
常用参数:
-c : 显示每行出现的次数
-d :仅显示重复过的行
-u :仅显示不曾重复过的行
实例:
[root@test tmp]# uniq -c test.txt
2 hello eagles
2 hello Linux
1 fjkldlaj
1 fdkajjf;
[root@test tmp]# uniq -d test.txt
hello eagles
hello Linux
[root@test tmp]# uniq -u test.txt
fjkldlaj
fdkajjf;
测试文本:
[root@test tmp]# cat test.txt
hello eagles
hello eagles
hello Linux
hello Linux
fjkldlaj
fdkajjf;
综合案例:以:为分割,取出/etc/passwd文件的第6列至第10列,并将这些信息按照第3个字段的数值大小进行排序,最后仅显示一个字段
[root@node1 ~]# cut ‐d: ‐f6‐10 /etc/passwd |cut ‐f3 | sort ‐n |uniq -c
[root@test tmp]# cut -d: -f6-10 /etc/passwd | sort -t: -k3 -n | uniq -c #sort -t字段分隔符号:三字段排序 最后显示一个字段uniq -c sort -n:表示数字大小排序 **-k #: 以指定字段为标准排序??????
cat log.txt | awk -F “”‘{print &1}’|sort|uniq -c|sort -nrt””|awk _F””‘print &2’|head -10