本文参考了鸟哥的Linux私房菜
数据流重定向
我们在使用linux的时候会经常用到重定向,数据流重定向就是将某个指令执行后应该要出现在屏幕上的数据,传输到其他地方,例如文件或者是打印机之类的装置。
一般情况下,如果我们执行一个指令,通常它会是这样的:
我们执行一个命令的时候,这个指令可能会由文件读入资料,经过处理之后,再将数据输出到屏幕上。Standard output与standard error分别代表标准输出与标准错误输出。
比如我们使用find /home –name testing > list_right 2> list_error
就可以将错误的的信息定向到list_error中,正确的输出定位到list_right中。
命令执行的判断依据
; , && , ||
在某些时候,我们如果需要一次执行多个指令。
sync; sync; shutdown –h now : 表示在关机时,先执行两次sync,再shutdown计算机。
ls /tmp && touch /tmp/testingagain :表示当tmp目录存在是,我在tmp目录下建立一个testingagain文件。
ls /tmp/testingagain || touch/tmp/testingagain :表示当这个文件不存在时建立这个文件。
管道命令(pipe)
在实际使用Linux时,我们可能不能一次性取得自己需要的数据,可能需要经过好几道手续才能得到我们所需要的格式,这种就需要用到管道命令|了。
我们先来看一个简单的例子
[root@localhost ~]# ls -al /etc | less
这样,就可以将ls指令输出后的内容,被less读取,可以利用less,对内容进行前后翻动。
管道命令仅能处理经由前一个指令传过来的正确信息,就是standard output (STDOUT)的信息,对于standard error并没有直接处理的能力。
在linux中,很多的信息处理都是以【行】为单位的。下面我们看看怎么对结果进行分析,取出我们需要的信息。
截取命令
简单的来说,就是将一段数据经过分析后,取出我们所需要的。
l cut
cut,就是将一段信息的某一段切出来
cut –d ‘分隔字符’ –f fields
cut –c 字符区间
-d :后面接分隔字符,与-f一起使用
-f :依据-d的分隔字符将一段信息分割成为数段。用-f取出第几段
-c :以字符的单位取出固定字符区间
l grep
grep是分析一行数据,当其中有我们所需要的,就将改行取出来
grep [-acinv] ‘搜寻字符串’filename
-a :将binary文件以TEXT文件的方式搜寻
-c :计算找到‘搜寻字符串’的次数
-I :忽略大小写的不同
-n :顺便输出行号
-v :反向选择,即显示出没有‘搜寻字符串’内容的那一行
排序命令
有时候,我们需要计算一次数据里相同形态的数据总数
l Sort
sort [-fbMnrtuk] [file or stdin]
-f :忽略大小写的差异
-b :忽略最前面的空格符部分
-M :以月份的名字来排序
-n :使用[纯数字]进行排序(预设以文字形态来排序)
-r :反向排序
-t : 分隔符,预设是tab键
-u :就是uniq,即相同的数据中,仅出现一行代表
-k :以那个区间(field)来进行排序的意思
uniq
当排序完成之后,想要将重复的资料仅显示一个
uniq [-ic]
-i :忽略大小写字符的不同
-c :进行计数
wc
可以帮我们计算输出的信息的整体数据
wc [-lwm]
-l :仅列出行
-w :仅列出多少字
-m :多少字符
l tee
这个命令前一篇讲过,就是将这个数据流的处理过程中,将某些信息存下来。
tee [-a] file
-a :以累加的方式,将数据加入file当中
字符转换命令
我们有时候在处理数据的时候,会进行一些转换,比如大写改成小写等
l tr
删除一段数据中的文字,或者用来进行文字信息的替换
tr [-ds] SET1 ...
-d :删除数据中SET1这个字符串;
-s :取代掉重复的字符!
l col
很多时候,可以用来简单的处理将[tab]按键取代成为空格
col [-xb]
-x :将 tab 键转换成对等的空格键
l join
处理两个文件之间的数据
join [-ti12] file1 file2
-t :预设以空格符分隔数据,并且比对第一个字段的数据,如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个
-i :忽略大小写
-1 :数字1,代表第一个档案要用那个字段来分析
-2 :代表第二个档案要用那个字段来分析
l paste
将两行贴在一起,且中间以[tab]键隔开
paste [-d] file1 file2
-d :后面可以接分隔字符,预设以[tab]来分隔
- :如果file部分写成 - ,表示来自standardinput的资料
l Expand
将[tab]按键转成空格键
expand [-t] file
-t :后面可以接数字,一般来说,一个tab按键可以用8个空格取代,也可以进行自定义
分割命令
split
split [-bl] file PREFIX
-b :后面可接欲分割成的文件大小,可以加单位,例如 b, k, m 等
-l :以行数来进行分割
参数代换
xargs 产生某个指令的参数的意思
xargs [-0epn] command
-0 :如果输入的 stdin 含有特殊字符,例如 `,\, 空格等字符时,这个参数可以将他还原成一般字符
-e :这是EOF(end of file). 后面借一个字符串,当xargs分析到这个字符串时,就会停止继续工作
-p :在执行每个指令的argument时,都会询问使用者的意见
-n :后面接次数。每次command指令执行时,要使用几个参数
减号
管道在bash的连续处理程序中非常重要。在管道中,常常会用前一个指令的stdout作为这一次的stdin,某些指令需要用到文件名称进行处理时,该stdin与stdout可以用减号“-”来替代
比如: tar –cvf - /home |tar –xvf –
将/home里的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将打包的传送给后面,这里的”-”是取前一个的stdout。