I/O redirection
input/output redirection
Everything is file
3个不同的文件:
stdin
stdout
stderr
重定向输出
标准输出
# 重定向 stdout
ls -l /usr/bin/ > ls-output.txt # 覆盖
ls -l /usr/bin/ >> ls-output.txt # 追加
错误输出
file descriptor
: 每个文件流(file stream)都有一个数字标识。其中,前三个分别是:
- 0:
stdin
- 1:
stdout
- 2:
stderr
重定向错误输出
ls no-exist 2> ls-error.txt
# 将消息重定向到 stderr
$ cat > error.sh
#!/bin/bash
echo 'error message' >&2
$ chmod +x error.sh
$ ./error.sh
error message
# 将 stderr 重定向到 文件
$ ./error.sh 2> error.txt
同时重定向标准输出和错误输出
# 方式一:将 stdout 重定向到文件,再将 stderr 重定向到 stdout (顺序不能颠倒,适用于老版本的shell)
$ ls no-exist > ls-output.txt 2>&1
# 方式二:新版本的 bash
$ ls no-exist &> ls-output.txt
$ ls no-exist &>> ls-output.tx
/dev/null
ls message-not-wanted > /dev/null
管道
管道(pipeline):将第一个命令的输出传给第二个命令的输入
$ ls -l /usr/bin/ | less
filer
sort:
-
-r
: reverse -
-u
: unique
$ ls
file_001 file_010 file_019 file_028 file_037 file_046 file_055 file_064 file_073 file_082 file_091 file_100
file_002 file_011 file_020 file_029 file_038 file_047 file_056 file_065 file_074 file_083 file_092
file_003 file_012 file_021 file_030 file_039 file_048 file_057 file_066 file_075 file_084 file_093
file_004 file_013 file_022 file_031 file_040 file_049 file_058 file_067 file_076 file_085 file_094
file_005 file_014 file_023 file_032 file_041 file_050 file_059 file_068 file_077 file_086 file_095
file_006 file_015 file_024 file_033 file_042 file_051 file_060 file_069 file_078 file_087 file_096
file_007 file_016 file_025 file_034 file_043 file_052 file_061 file_070 file_079 file_088 file_097
file_008 file_017 file_026 file_035 file_044 file_053 file_062 file_071 file_080 file_089 file_098
file_009 file_018 file_027 file_036 file_045 file_054 file_063 file_072 file_081 file_090 file_099
$
$ ls | sort | head -n 5
file_001
file_002
file_003
file_004
file_005
$
$ ls | sort -r | head -n 5
file_100
file_099
file_098
file_097
file_096
# 将两个目录的程序结合起来,排序,去除重复 -u, --unique
ls /usr/bin/ /bin/ | sort -u
uniq重复的对已排序的内容进行去重
-
uniq -d
:(duplicate) 仅显示重复的内容
# 去重
$ ls /usr/bin/ /bin/ | sort | uniq
# 仅显示有重复的行
$ ls /usr/bin/ /bin/ | sort | uniq -d
wc 计算行数,单词数,字节数
$ cat > data.txt
Hello World
I am using Linux
$ wc data.txt # lines words bytes
2 6 29 data.txt
#最长的一行有16个字符
$ wc -L data.txt
16 data.txt
# 共有 653 个程序
$ ls /usr/bin/ | wc -l
653
grep:支持正则表达式,将每一行和 模式 (pattern) 匹配,成功则输出
-
-i
:不区分大小写 -
-v
:输出不匹配的项
# 查看系统中有多少软件是更压缩文件相关的
$ ls /usr/bin/ /bin/ | grep zip
gpg-zip
gunzip
gzip
gpg-zip
gunzip
gzip
-
head -n 5 data.txt
:查看前5行 -
tail -n 5 data.txt
:查看后5行 -
tail -f
: 查看后10行,并监视文件,当有新内容时,立即显示
# 查看前5行
$ ls /usr/bin/ | head -n 5
[
addr2line
alias
apropos
ar
- 以上的命令,当给定文件名作为参数时,命令从文件中读取内容作为输入
- 还可以用于管道中
tee:从标准输出中读取内容,并将内容写入一个文件和标准输出
tee 通常用于捕捉管道中的内容
$ ls /usr/bin/ | tee programs.txt | grep zip
gpg-zip
gunzip
gzip
$ wc -l programs.txt
653 programs.txt
cat
cat
除了查看简单文本外,还可以...
将下载的文件拼接起来
$ ls
hi.mp3_1 hi.mp3_2 hi.mp3_3
$ cat hi.mp3_* > hi.mp3 # 系统会按顺序展开通配符
快捷的文本编辑器
# <Ctrl-D> 表示 EOF,文本末尾
$ cat > hello.txt
Hello World, I am using Linux right now.<Ctrl-D>
网友评论