重定向
Linux shell接收或发送徐磊和字符串流行是的输入或输出,不管实际的字符串流进入或来自哪个文件、键盘、显示窗口等设备,都使用文件I/O技术来访问流。Linux shell使用3种标准的I/O流,每种流都与一个文件描述符相关:
1.stdout是标准输出流,显示来自命令的输出,文件描述符为1
2.stderr是标准错误流,显示来自命令的错误输出,文件描述符为2
3.stdin是标准输入流,为命令提供输入,文件描述符为0
重定向输出:
> 输出重定向到一个文件或设备,覆盖原来的文件
>! 输出重定向到一个文件或设备,强制覆盖原来的文件
>> 输出重定向到一个文件或设备,追加原来的文件
n> 标准输出/标准错误重定向到一个文件或者设备,覆盖原来文件(1为默认)
n>> 标准输出/标准错误重定向到一个文件或者设备,追加原来的文件(1为默认)
m>&n 标准输出/标准错误重定向到标准错误输出/标准错误
m>>&n
&> 将标准输出和标准错误重定向到同一个文件中
&>>
注意:
1.以下两个指令:
command 2>&1 1>output.txt
command 1>output.txt 2>&1
这个指令是不一样的,第一种情况中,stderr被重定向到stdout的当前位置,然后再将stdout重定向到output.txt,但1>output.txt只影响stdout,不影响stderr。第二种情况中,stderr被重定向到stdout的当前位置,即output.txt中。
2.可以将选择的流重定向到空文件/dev/null,这样相当于完全忽略所选的标准流。使用cat命令显示/dev/null是空的。
重定向输入:
< 输入重定向到一个程序,如tr ' ' '\n' < text
0< 标准输入重定向
注意:
1.输入重定向与管道是可以互换的,例如cat file | tr ' ' '\t'使用管道命令将cat指令的标准输出果作为tr指令的标准输入,可以写成tr ' ' '\t' < file。
2.shell存在here-document的概念,这是另一种输入重定向的形式,它将<<和一个单词结合构成一个标记,用来表示输入端结束符,例如:
sort -n << END
该指令接收来自标准输入端的字符,直到END为止,然后sort排序。当然也可以使用sort -n以及CTRL+D来代替。
管道
1.在两个命令之间使用管道|操作符将前一个命令的stdout指向第二个命令的stdin,可以通过添加更多的命令和管道操作符来构造更长的管道线。使用管道操作符后,可以使用连字符-取代文件名作为一个参数,用于表述输入来自stdin而不是文件。
2.需要注意,管道线仅将stdout导向stdin,不能使用2|这样的形式单独到处stderr,但是可以先将stderr重定向到stdout,然后使用管道命令,例如ls y* x* z* 2>&1 | sort。
3.管道不涉及到中间文件,第一个命令的stdout没有写到一个文件中,然后再由第二个命令读取(相当于重定向的写法),例如bunzip2 -c somefile.tar.bz2 | tar -xvf -命令。
与管道相关的一些指令
cut -d "分割字符" [-cf] fields file //使用某分隔符分割并列出要求的区域
-d 后面接的是分割字符,默认是空格符
-c 后面接的是第几个字符
-f 后面接的是第几个区块
例子:
cat /etc/passwd | cut -d ":" -f 1
将passwd文件中每一行里的":"用作分隔符,列出第一个区块。
last | cut -d " " -f 1
以空格作为分隔,并列出第一个区块。
sort [-t 分隔符] [(+起始)(-结束)] [-nru] file //排序
-t 分隔符,用来隔开不同的区块,默认是TAB
-n 使用纯数字排序(默认以字母方式排序)
-r 反向排序
-u 相同出现的一行,只列出一次
+start -end 由第start区块排序到第end区块
wc [-lmw] file
-l 计算有多少行
-m 计算有多少字符
-w 计算有多少字
wc用于统计,例如要知道目前帐号文件里有多少帐号,就是用wc -l,因为/etc/passwd里一行代表一个用户,即:cat /etc/passwd | wc -l。
uniq [-cdu] inputfile [outputfile] //默认用来显示所有的行一次
-c 用于计算每行出现的次数
-d 只打印不重复的行
-u 只打印重复的行
例如:
last | cut -d " " -f 1 | sort | uniq
tee file
tee命令将数据同时显示在屏幕上和文件中,使用方式如下:
last | tee file | cut -d " " -f 1
last的输出数据传入file中,也会同时传给stdout。
tr [-ds] SET1 [SET2] //从标准输入中翻译、删除字符串,并写到标准输出中
-d 删除SET1这个字符串
-s 对SET1出现的字符,当连续出现时仅打印一次
例如:
cat /etc/passwd | tr -d :
这个命令会删除':'这个符号并显示输出。
last | tr '[a-z]' '[A-Z]'
这个命令将小写改成大写,取代原有的字符。
split [-bl num] 输入文件 输出文件前导字符
-b 以文件size来分
-l 以行数来分
该指令将某文件内容分割成几个子文件,子文件名字为前导字符+aa、ab、ac等,使用-l指定每个文件的行数,使用-b指定每个文件的大小。
例子:
split -l 5 /etc/passwd test //产生testaa、testab等文件。