linux下的標(biāo)準(zhǔn)輸入、輸出、重定向、管道
在Linux系統(tǒng)中,有4個(gè)特殊的符號(hào),<, ‘>’, ‘|’, ‘-‘,在我們處理輸入和輸出時(shí)存在重要但具有迷惑性的作用。
默認(rèn)Linux的命令的結(jié)果都是輸出到標(biāo)準(zhǔn)輸出,錯(cuò)誤信息 (比如命令未找到或文件格式識(shí)別錯(cuò)誤等) 輸出到標(biāo)準(zhǔn)錯(cuò)誤,而標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤默認(rèn)都會(huì)顯示到屏幕上。
>表示重定向標(biāo)準(zhǔn)輸出,> filename就是把標(biāo)準(zhǔn)輸出存儲(chǔ)到文件filename里面。標(biāo)準(zhǔn)錯(cuò)誤還是會(huì)顯示在屏幕上。
2 >&1 表示把標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出。Linux終端用2表示標(biāo)準(zhǔn)錯(cuò)誤,1表示標(biāo)準(zhǔn)輸出。
- (短橫線):表示標(biāo)準(zhǔn)輸入,一般用于1個(gè)程序需要多個(gè)輸入的時(shí)候。
<標(biāo)準(zhǔn)輸入,后面可以跟可以產(chǎn)生輸出的命令,一般用于1個(gè)程序需要多個(gè)輸入的時(shí)候。
|管道符,表示把前一個(gè)命令的輸出作為后一個(gè)命令的輸入,前面也有一些展示例子。用于數(shù)據(jù)在不同的命令之間傳輸,用途是減少硬盤存取損耗。
下面我們通過一個(gè)程序stdout_error.sh來解釋上面的文字,內(nèi)容如下
#!/bin/bash
echo "I am std output"
# 下面是隨便寫的一個(gè)理論上不存在的命令, 理論上會(huì)報(bào)錯(cuò)的。
unexisted_command
運(yùn)行這個(gè)腳本
# 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤默認(rèn)都會(huì)顯示到屏幕上
ct@ehbio:~$ bash stdout_error.sh
I am std output
stdout_error.sh: line 5: unexisted_command: command not found
# >把結(jié)果輸入到了文件;標(biāo)準(zhǔn)錯(cuò)誤還顯示在屏幕上
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout
stdout_error.sh: line 5: unexisted_command: command not found
ct@ehbio:~$ cat stdout_error.stdout
I am std output
# >把結(jié)果輸入到了文件; 2>把標(biāo)準(zhǔn)錯(cuò)誤輸入到了另一個(gè)文件
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout 2>stdout_error.stderr
ct@ehbio:~$ cat stdout_error.stderr
stdout_error.sh: line 5: unexisted_command: command not found
# 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤寫入同一個(gè)文件
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout 2>&1
ct@ehbio:~$ cat stdout_error.stdout
I am std output
stdout_error.sh: line 5: unexisted_command: command not found
下面看管道符和標(biāo)準(zhǔn)輸入的使用。
# 管道符的使用
# 第一個(gè)命令的輸出作為第二個(gè)的輸入
# 前面的例子中也有使用
# tr: 是用于替換字符的,把空格替換為換行,文字就從一行變?yōu)榱艘涣?ct@ehbio:~$ echo "1 2 3" | tr ' ' 'n'
1
2
3
# cat命令之前也用過,輸出一段文字
# diff是比較2個(gè)文件的差異的,需要2個(gè)參數(shù)
# - (短橫線)表示上一個(gè)命令的輸出,傳遞給diff
# < 表示其后的命令的輸出,也重定向給diff
ct@ehbio:~$ cat <<END | diff - <(echo "1 2 3" | tr ' ' 'n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4
# 如果不使用管道和重定向標(biāo)準(zhǔn)輸入,程序是這么寫的
# 先把第一部分存儲(chǔ)為1個(gè)文件
ct@ehbio:~$ cat <<END >firstfile
2
3
> 4
> END
ct@ehbio:~$ less firstfile
# 再把第二部分存儲(chǔ)為1個(gè)文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' 'n' >secondfile
# 然后比較
ct@ehbio:~$ diff firstfile secondfile
0a1
> 1
3d3
< 4
管道符的更多應(yīng)用
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' 'n' | wc -l
3
# sed =:先輸出行號(hào),再輸出每行的內(nèi)容
ct@ehbio:~$ echo "a b c" | tr ' ' 'n' | sed =
1
a
2
b
3
c
# 后面這個(gè)命令不太好解釋
# sed = 同時(shí)輸出行號(hào)
# N: 表示讀入下一行;sed命令每次只讀一行,加上N之后就是緩存了第2行,所有的操作都針對(duì)第一行;
# s: 替換;把換行符替換為t
ct@ehbio:~$ echo "a b c" | tr ' ' 'n' | sed = | sed 'N;s/n/t/'
1 a
2 b
3 c
# 后面這個(gè)命令不太好解釋
# sed = 同時(shí)輸出行號(hào)
# N: 表示讀入下一行;sed命令每次只讀一行,加上N之后就是緩存了第2行,所有的操作都針對(duì)第一行;
# s: 替換;把讀取的奇數(shù)行行首加一個(gè)'>'(偶數(shù)行相當(dāng)于被隱藏了)
ct@ehbio:~$ echo "a b c" | tr ' ' 'n' | sed = | sed 'N;s/^/>/'
>1
a
>2
b
>3
c
# 把多條序列轉(zhuǎn)成FATSA格式
# sed = 同時(shí)輸出行號(hào)
# N: 表示讀入下一行;sed命令每次只讀一行,加上N之后就是緩存了第2行,所有的操作都針對(duì)第一行;
# s: 替換;把讀取的奇數(shù)行行首加一個(gè)'>'(偶數(shù)行相當(dāng)于被隱藏了)
# 于是FASTA格式序列就出來了
ct@ehbio:~$ echo "actg aaaaa cccccg" | tr ' ' 'n' | sed = | sed 'N;s/^/>/'
>1
actg
>2
aaaaa
>3
cccccg