重定向

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是空的。
3.文件重定向的命令行内容是从左到右估算的。以下面的两个命令为例:
sort 0<students 1>students.sorted 2>sort.error
如果上述命令中因为students文件不存在而无法启动,那么1>students.sorted 2>sort.error这一段便无法执行,所以错误消息依然被发送到显示屏,而不是保存到文件sort.error中。
sort 2>sort.error 0<students 1>students.sorted
上述命令解决了这个问题,如果sort命令不能启动是因为students文件不存在,错误消息会被保留到文件sort.error中,因为shell在确定文件students不存在之前就已经处理了错误输出重定向。

重定向输入:
-------------------------------------------------------------
<        输入重定向到一个程序,如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等文件。