您的位置:首页 > 运维架构 > Shell

Linux常用命令笔记-Shell

2013-11-17 01:00 369 查看

Shell

何为Shell,就是用户和操作系统核心交互的工具,用户通过Shell向操作系统发送指令,来支配系统中的硬软件设备。

在Linux上使用的Shell有很多,其中最为广泛的要数Bash(BourneAgain Shell,简称sh),一般Linux都是以这个为预设的Shell。 想知道现在用的是什Shell,可以 [echo $SHELL]



History

查看命令历史。要执行历史命令,只需要[! n]

type

[type command]来查询命令是否bash的内建命令,加[-a],如果是内建命令如[type–a cd]就会显示“cd is a shell builtin”,如果不是,就会显示其路径位置。

$ type -a ls

ls is aliased to `ls --color=auto'

ls is /bin/ls



ls

列出文件和目录的内容,一般用[ ls-ltr]
-1 每列仅显示一个文件或目录名称。 原来是并排显示的,现在每个文件为一行。
-l 使用详细格式列表。
-a或--all 显示所有文件和目录,包括隐藏文件。
-A或--almost-all 同-a,只是不显示...
-c 以更改时间排序,显示文件和目录。
-d或--directory
显示目录名称而非其内容。
-h或--human-readable 用"K","M","G"来显示文件和目录的大小。
-H或--si 此参数的效果和指定"-h"参数类似,但计算单位是1000Bytes而非1024Bytes。
-r或--reverse 反向排序。
-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-m 用","号区隔每个文件和目录的名称。
-S 用文件和目录的大小排序。
-t 用文件和目录的更改时间排序。
-b或--escape 显示脱离字符。
-B或--ignore-backups 忽略备份文件和目录。
-C 以又上至下,从左到右的直行方式显示文件和目录名称。
-D或--dired 用Emacs的模式产生文件和目录列表。
-f 此参数的效果和同时指定"aU"参数相同,并关闭"lst"参数的效果。
-F或--classify 在执行文件,目录,Socket,符号连接,管道名称后面,各自加上"*","/","=","@","|"号。
-g 次参数将忽略不予处理。
-G或--no-group 不显示群组名称。
-i或--inode 显示文件和目录的inode编号。
-I<范本样式>或--ignore=<范本样式> 不显示符合范本样式的文件或目录名称。
-k或--kilobytes 此参数的效果和指定"block-size=1024"参数相同。
-L或--dereference 如遇到性质为符号连接的文件或目录,直接列出该连接所指向的原始文件或目录。
-n或--numeric-uid-gid 以用户识别码和群组识别码替代其名称。
-N或--literal 直接列出文件和目录名称,包括控制字符。
-o 此参数的效果和指定"-l"参数类似,但不列出群组名称或识别码。
-p或--file-type 此参数的效果和指定"-F"参数类似,但不会在执行文件名称后面加上"*"号。
-q或--hide-control-chars 用"?"号取代控制字符,列出文件和目录名称。
-Q或--quote-name 把文件和目录名称以""号标示起来。
-s或--size 显示文件和目录的大小,以区块为单位。
-T<跳格字符>或--tabsize=<跳格字数> 设置跳格字符所对应的空白字符数。
-u 以最后存取时间排序,显示文件和目录。
-U 列出文件和目录名称时不予排序。
-v 文件和目录的名称列表以版本进行排序。
-w<每列字符数>或--width=<每列字符数> 设置每列的最大字符数。
-x 以从左到右,由上至下的横列方式显示文件和目录名称。
-X 以文件和目录的最后一个扩展名排序。
--block-size=<区块大小> 指定存放文件的区块大小。
--color=<列表格式> 培植文件和目录的列表格式。
--full-time 列出完整的日期与时间。

压缩备份

压缩和解压缩,都是会把原来的文件删掉,除非加参数



一般Linux上的压缩格式--------------------------

*.Z compress 程序压缩的档案;

*.bz2 bzip2 程序压缩的档案;

*.gz gzip 程序压缩的档案; GNU zip

*.tar tar 程序打包的数据,并没有压缩过;

*.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩



gzip zcat
-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;

-d :解压缩的参数;

-t :可以用来检验一个压缩档的一致性~看看档案有无错误;

-# :压缩等级,-1 最快,但是压缩比最差、-9最慢,但是压缩比最好!预设是 -6

$ zcat test.gz 将内容解压后显示,相当于[zip cat]

$ gzip -d test.gz 解压

$ gzip -9 -c test> test_tmp.gz 一般压缩后都是在源文件后加.gz,除非>指定。

tar 打包
gzip只能压缩单个文件,而如果要压缩整个目录,可以通过tar来完成。同时,tar 可以配合gzip,同时整合并压缩。



-c :建立一个压缩档案的参数指令 (create的意思);

-x :解开一个压缩档案的参数指令!

-t :查看 tarfile 里面的档案!

【c/x/t 仅能存在一个,不可同时存在,因为不可能同时压缩与解压缩】

-z :是否需要用 gzip 压缩?

-j :是否需要用 bzip2 压缩?

-v :压缩的过程中显示log

-f :使用档名,在f之后要立即接档名,不要再加参数!

例如『 tar -zcvfP tfile sfile』要写成『 tar -zcvPftfile sfile』

-p :使用原档案的原来属性 (被打包的档案将不会依据使用者的身份来改变权限)

-P :可以使用绝对路径来压缩

-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中!一般用于备份,因为有时候只要备份较新的档案,旧的已经备份过了,就没有必要再重新操作。



将整个 /etc目录下的档案全部打包成为/tmp/etc.tar

$ tar -cvf destZip.tar srcDir 仅打包,不压缩;

$ tar -zcvf destZip.tar.gz srcDir 打包后,以 gzip 压缩;



$ tar -tvf destZip.tar 查看打包目录文件;如果是压缩过的,要加z



在 /home 当中,比 2005/06/01 新的档案才备份

$ tar -N '2005/06/01' -zcvf home.tar.gz /home



只想要解压/tmp/etc.tar.gz 内的 etc/passwd

$ tar -zxvf /tmp/etc.tar.gz etc/passwd



我要备份 /home, /etc ,但不要 /home/dmtsai

$ tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc



cpio 备份-数据量重导向 P336
透过数据流重导向的方法来将档案进行输出/输入的一个方式



o :将数据 copy 输出到档案或装置上

-i :将数据自档案或装置copy 出来系统当中

-t :查看 cpio 建立的档案或装置的内容

-c :一种较新的portable format 方式储存

-v :让储存的过程中文件名称可以在屏幕上显示

-B :让预设的 Blocks 可以增加至 5120bytes ,预设是 512 bytes !

这样的好处是可以让大档案的储存速度加快(请参考 i-nodes 的观念)

-d :自动建立目录!由于cpio 的内容可能不是在同一个目录内,

如此的话在反备份的过程会有问题! 这个时候加上 -d 的话,

就可以自动的将需要的目录建立起来了!

-u :自动的将较新的档案覆盖较旧的档案!



文档处理

文件使用惯例
文件使用惯例,用空格,Tab等隔开,但是由于连续空字段不好区分,所以一般使用冒号: ,如 /etc/passwd

apache:x:48:48:Apache:/var/www:/sbin/nologin

avahi:x:70:70:Avahi mDNS/DNS-SDStack:/var/run/avahi-daemon:/sbin/nologin

通过:来分隔,字段意思分别是:用户名,加密后密码,用户id,用户组id,用户姓名,根目录,登陆的shell



cp

复制文件或目录

-r 或-R (recur) 递归,把目录下面的所有文件和目录都复制

  -s或--symbolic-link  对源文件建立符号连接,而非复制文件。

-a或--archive  此参数的效果和同时指定"-dpR"参数相同。

-b或--backup  删除,覆盖目标文件之前的备份,备份文件会在字尾加上一个备份字符串。

  -d或--no-dereference 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。

  -f或--force  强行复制文件或目录,不论目标文件或目录是否已存在。

  -i或--interactive  覆盖既有文件之前先询问用户。

  -l或--link  对源文件建立硬连接,而非复制文件。

  -p或--preserve  保留源文件或目录的属性。

  -P或--parents  保留源文件或目录的路径。

  -S<备份字尾字符串>或--suffix=<备份字尾字符串>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字尾字符串是符号"~"。

-u或--update  使用这项参数后只会在源文件的更改时间较目标文件更新时或是 名称相互对应的目标文件并不存在,才复制文件。

-v或--verbose  显示指令执行过程。

-V<备份方式>或--version-control=<备份方式>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这字符串不仅可用"-S"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字串。

-x或--one-file-system 复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不予复制。



mv
移动目录或者文件,重命名也是通过这种方式实现的。[默认下,目标文件遇到重名,直接覆盖]

-b或--backup 若需覆盖文件,则覆盖前先行备份。

-f或--force 若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录。

-i或--interactive覆盖前先行询问用户。

-S<附加字尾>或

--suffix=<附加字尾> 与-b参数一并使用,可指定备份文件的所要附加的字尾。

-u或--update 在移动或更改文件名时,若目标文件已存在,且其文件日期比源文件新,则不覆盖目标文件。

-v或--verbose 执行时显示详细的信息。



rm
删除文件和目录,如果是非空目录的话,不能直接删除,要用-r。

-r或-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。

-i或--interactive删除既有文件或目录之前先询问用户。

-d或--directory 直接把欲删除的目录的硬连接数据删成0,删除该目录。

-f或--force 强制删除文件或目录。

-v或--verbose 显示指令执行过程。



ln
为某一个文件在另外一个位置建立一个链接,这个命令最常用的参数是-s,具体用法是:ln -s srcFile destFile。

当我们需要在不同的目录,用到相同的文件时,我们不需要复制两个文件,而只要创建一个,然后在另一个目录下创建一个连接(link),这两个文件就同步了,两边都同时接受修改,不必重复的占用磁盘空间。例如:ln -s /bin/less /usr/local/bin/less

Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link)。

和Java的强引用弱引用有点像,这里的硬连接就相当于强引用,只要一个file存在强连接,就不会被删除回收,真正删除一个文件,是要把这个文件下所有强连接都rm才算删除掉。而且不同的连接可以有不同的名字,这个和强引用很像吧!

软连接和java的弱引用很像,虽然引用挂在上面,但是和文件的删除回收没有关系,只要源文件被删除,那么软连接也就失效了。而如果只是删除软连接的话,源文件是不会受到影响的。

硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

  -f : 链结时先将与 dist 同档名的档案删除
  -d : 允许系统管理者硬链结自己的目录
  -i : 在删除与 dist 同档名的档案时先进行询问
  -n : 在进行软连结时,将dist 视为一般的档案
  -s : 进行软链结(symboliclink) 【默认建立硬链接】
  -v : 在连结之前显示其档名
  -b : 将在链结时会被覆写或删除的档案进行备份
  -S SUFFIX :将备份的档案都加上 SUFFIX的字尾
  -V METHOD :指定备份的方式

vi
vi是Linux上正规的文本编辑器,所有版本的Linux都有,所以通用性很强。

基本上 vi 共分为三种模式,分别是『一般模式』、 『编辑模式』与『指令列命令模式』三种!

如果vi一个不存在的file,下面会提示[NewFile],输入内容后:wq会自动创建这个文件;否则不创建。



一般模式:

vi刚进去的时候是一般模式,移动光标进行阅读,可以处理删除、复制、粘贴等等的动作。 不过粘贴后自动进入--INSERT--状态



编辑模式:

在一般模式下,按下『i, I, o,O, a, A, r, R』等字母之后才会进入编辑模式。

如果要回到一般模式时, 则必须要按下『Esc』这个按键即可退出编辑模式。



指令列命令模式:

在一般模式当中,输入『 : 或 / 或 ? 』就可以将光标移动到最底下那一行。[:]是用来输入指令的,如[:wq]保存退出; 而[/][?]是用于搜索的,如查找work可以写成[/word]





一般模式下--------------------------------------

如果想要多次移动的话,可以在方向前添加数字,如向下移动30行,可以使用"30↓"。

空格和→等效,都是向右移动。[0]移动到行首,[$]移动到行尾

[G]移动到文件最后一行,[nG]移动到n行,和eclipse的Ctrl+L等效。[gg]移动到文件第一行。

[H]移动到当前屏幕第一行,[L]移动到当前屏幕最后一行。

[x]向后删除,相当于[del];[X]向前删除,相当于退格键。[nx][nX]删除多个

★[dd]删除当前行,相当于eclipse的Ctrl+D;[ndd]删除n行;[d0] 删除至行首;[d$]删除至行尾;[d1G]删除到第一行;[dG]删除到最后一行。

★[yy]复制当前行,[nyy]复制n行;[y0]复制到行首;[y$]复制到行尾;[y1G]复制到第一行;[yG]复制到最后一行。

[p]把复制内容粘贴到光标下一行;[P]上一行。

[u]还原[Ctrl+r]重做;相当于Ctrl+Z/Y

[.]重复上一个动作。



命令模式[:]下-------------------------------------

[:w]保存文件;[:w newFile]另存为newFile;[:n1,n2 w newFile]把n1行到n2行的内容保存到newFile中。

[:r otherFile]把otherFile的内容插入的光标处。

[:set nu]显示行号;[:setnonu]取消显示行号。 :set能设置很多vi的状态

[!]有强制的意思,如[:q!]就是不保存直接退出;[:w!]就是强制写入只读文件,当然是在有权限的前提下;[:e!]强制还原到原来打开时候的文件。



命令模式[/][?]下-------------------------------------

[/word]搜索word字符,按
表示上一个,
表示下一个。

[:1,s/first/second/g]把第一行的”first”替换成”second”。如果把[g]改成[gc]就需要确认,每按一次y替换一个,很方便直观。

第一行到第五行[:1,5s/first/second/g],第一行到最后一行[:1,$s/first/second/g]



vi还有暂存盘的功能。当我们编辑一个file的时候,在同一个目录会保存一个名为.XXXX.swp的隐藏文件,用来临时保存我们的修改。一旦系统挂了,下次重新vi这个file的时候,系统就会问你是否要恢复『Recovery』,你输入[R]后就会回到这个临时文件中,原来修改的东西都会在了。



vim
vim是vi的加强版,现在很多系统都直接把vim覆盖vi。如果你使用 vi 后,却看到画面的右下角有显示目前光标所在的行列号码,那么您的 vi 已经被 vim 所取代了。

vim的优点在于:具有颜色显示的功能,并且还支持许多的程序语法 (syntax),因此,当您使用 vim 编辑程序时( 不论是 C 语言,还是 shell script ),我们的 vim 将可帮您直接进行『程序除错 (debug)』的功能! 而且还会记录你的操作,下次重新打开的时候会保持原来的状态,这些信息会记录在~/.viminfo中

[v] 字符选择,会将光标经过的地方反白选择!

[V] 行选择,会将光标经过的行反白选择!

[Ctrl+v] 区块选择,可以用长方形的方式选择资料

[y] 将反白的地方复制起来

[d] 将反白的地方删除掉



cat
cat是concatenate的简写,显示或连结一般的ascii文本文件。类似DOC中的type。

$ cat text 显示text这个文件
$ cat file1 file2 依次显示file1,file2的内容
$ cat file1 file2>file3


more/ less
more用于显示较大的文件,只显示第一屏,等你按任何的一个键以后,才继续显示。
而less除了有more的功能以外,还可以用方向键往上或网下的滚动文件,让你随意浏览,阅读文章时,less是个非常好的选择。


换行
Linux和DOS的换行符是不同的,DOS使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。而在Linux底下,则是仅有LF ($)这个断行符号。

如果没有经过转换,在Windows编辑后直接拉到Linux,在Linux底下的指令在开始执行时,他的判断依据是『Enter』,由于 DOS 的断行符号是 CRLF ,也就是多了一个^M的符号出来所以会导致无法执行,就会报”…
^M …”的错误。

可以通过命令来转换:

$ dos2unix[-kn] file [newfile]

$ unix2dos[-kn] file [newfile]



也可以通过tr命令来删除^M,即dos的换行符'\r'(详见下面tr):

$ cat .dostxt | tr -d '\r' >dostxt-noM





cut 列
cut可以进行列的分割,所以纵向分析log或者文件的时候很方便,就像用excel分析,可以取特定的列,也可以取特定的纵向位置的字符串。

-d :后面接分隔字符。与 -f 一起使用;

-f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;

-c :以字符(characters) 的单位取出固定字符区间

一般比较很难保证长度一样,所以-c一般用的不多。

$ ls -l | cut -d ' ' -f 1 列表后,以’ ’分割开,取第一列。 就是权限列

drwxr-xr-x.

drwxrwxr-x.



grep 行
egrep:扩展查找,正则匹配

fgerp:快速查找,非正则匹配

grep:最早的文本匹配 -E等效于egrep;-F等效于fgerp

可以指定匹配模式:-e pat-list -f pat-list-file



-a :将 binary 档案以 text 档案的方式搜寻数据

-c :找到结果的数目

-i :忽略大小写的不同,所以大小写视为相同

-l 显示匹配模式,而不是打印匹配行

-n :顺便输出行号

-v :反向选择,显示不匹配的行



$ ls -l | cut -d ' ' -f 1 | grep 'd'

drwxr-xr-x.

drwxr-xr-x.

$ ls -l | grep -v'jscai' 查找没有jscai字段的



tr
用来删除一段讯息当中的字符,或是进行字符的替换,常常用来取代档案中的怪异符号!

-d :删除讯息当中的 SET1这个字符串;

-s :取代掉重复的字符!



$ ls 源文件名

ls.txt sortNew.txt



$ ls | tr '[t,x]' '[a,b]' 把[t,x]依次替换成[a,b]

ls.aba soraNew.aba

$ ls | tr '[a-z]' '[A-Z]' 同理大小写替换,使用 []可以特定替换,或者范围替换。



$ ls | tr -d '[s,t]' -d删除特定字符串,也可以用[]

l.x orNew.x



范例二:将 /etc/passwd 输出的讯息中,将冒号(:) 删除

[root@linux ~]#cat /etc/passwd | tr -d ':'

范例三:将 DOS 档案的断行字符 ^M 符号删除:

[root@linux ~]#cat /home/test/dostxt | tr -d '\r' > dostxt-noM

# 那个 /r 指的是 DOS 的断行字符,关于更多的字符,请参考 man tr



col/expand
col把tab转换成空格: $ cat /etc/test.txt | col -x

expand -t n(n为数字),把tab转换成n个空格



join 处理两个相关文件的合并,有相同数据行,合并在一起 P406

paste 直接把两行贴在一起,中间以tab隔开



sort
sort可以根据不同的标准来排序。 【ls是默认以名字顺序排序的】

-f : 忽略大小写的差异,例如 A 与 a 视为编码相同;

-b :忽略最前面的空格符部分;

-M :以月份的名字来排序,例如JAN, DEC 等等的排序方法;

-n :使用『纯数字』进行排序(预设是以文字型态来排序的);

-r :反向排序;

-u :就是 uniq ,相同的数据中,仅出现一行代表;

-t :分隔符,预设是 tab 键;

-k :以那个区间 (field) 来进行排序,一般都和-t一起使用

$ ls -l | sort -t ' ' -k 5 以’ ’分割后的第五列排序

-rw-rw-r--. 1 redhat redhat 0 Oct 20 07:54 show

-rw-rw-r--. 1 redhat redhat 10 Oct 18 20:09 ab2

-rw-rw-r--. 1 redhat redhat 12 Oct 18 20:07 test

drwxrwxr-x. 2 redhat redhat 4096 Oct 12 20:16 bin



split
根据文件的大小或者行数,来分割成几个文件

-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;

-l :以行数来进行分割。



$ split -b 300k /etc/termcap xxx 分成300k一个的小文件

会以xxxaa,xxxab, xxxac 等方式来建立小档案的!



uniq
-i :忽略大小写字符的不同;

-c :进行计数



uniq能去重结果里面的内容,如下面,我去重列表中的第二列数据。但是明显有两个1,这是因为没有连在一起,如果想要彻底去掉,就需要先排序

$ ls -l | cut -d ' ' -f 2 | uniq

1

2

1

4

wc wordCount
如果我想要知道/etc/man.config 这个档案里面有多少字?多少行?多少字符的话,可以怎么做呢?其实可以利用 wc 这个指令来达成喔

-l :仅列出行

-w :仅列出多少字(英文单字);

-m :多少字符;

$ ls | wc -l 一般这个还是很常用的



文件搜索

在 Linux 底下也有相当优异的搜寻系统呦!通常 find 不很常用的!因为速度慢之外,也很操硬盘!

通常我们都是先使用 whereis或者是locate来检查,如果真的找不到了,才以find来搜寻!为什么呢?因为Linux
系统会将系统内的所有档案都记录在一个数据库档案里面,而whereis 与 locate 是利用数据库来搜寻,所以相当的快速。而find是直接搜寻硬盘,所以花销很大。

which寻找可执行文档,在$PATH的路径下查找;

whereis会把相关的文档都列举出来



find
$ find [PATH][option] [action]

其中action是[-exec],后面可以加其他指令来对结果进行进一步处理: -exec command

名字相关:

find/home/redhat –name test 在”/home/redhat”下查找名字为test的文件

其中test名字可以使用通配符,如’*est’



类型相关:

-type TYPE :搜寻档案的类型为TYPE $ find /home/redhat –typed

(类型主要有:f一般档案;d目录;b/c装置档案;l连结档;s socket;p FIFO等。



时间相关:

-atime n :在n天之前的『一天之内』被access过的档案;

-ctime n :在n天之前的『一天之内』被change过状态的档案;

-mtime n :在n天之前的『一天之内』被modification过的档案;

-newer file :只要比file的updateDate新,都要列出来。



拥有者相关:

Owner : -uid userId -user ownerName -nouser

Group : -gid groupId -group groupName -nogroup

查找owner为redhat的文件 : $ find /home/redhat –user redhat



权限相关:

-perm mode :搜寻档案属性『刚好等于』mode,这个mode为类似chmod的属性值,举例来说,-rwsr-xr-x 的属性为 4755 !

-perm -mode :搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,我们要搜寻-rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来。

-perm +mode :搜寻档案属性『包含任一mode 的属性』的档案,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在!



大小相关:

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有:

c: 代表 byte, k: 代表 1024bytes。



IO 标准输入输出

标准的输入输出就是程序的数据来源、去向以及错误输出。

UNIX默认的标准输入输出和错误输出都是终端。我们可以通过cat来体验,如果输入cat,然后再输入一句话,就会马上看到一样的输出。

$ cat

$ Hello World

Hello World



read 键盘输入
read [-pt] variable

-p :后面可以接提示字符!

-t :后面可以接等待的秒数,不会一直等待使用者!



如果直接跟一个变量,就会把键盘输入存入变量:$ read readVar

$ read -p "What do you wantto say: " -t 30 something

Hello World

$ echo $something

Hello World



I/O重定向
I/O重定向就是,你重新安排从哪里输入,或者输出到哪里。

< 改变程序的输入,program <file,就是将program的输入改成file

$ tr -d '\r' < dos-file.txt



> 改变程序的输出,program >file,就是将program的输出改成file。

> 在文件不存在时,会新建一个;如果已存在就会覆盖旧的。

$echo "Hi" > ioReDirect.txt

$ echo "Hello" > ioReDirect.txt

>> 附加到文件末尾:如果不存在则新建;已存在,则附加到文件末尾。

$ echo "World" >> ioReDirect.txt 我们也能看到,echo是自带的换行符



注意,此处执行命令的重定向,其实是分两个标准流Stdout和Stderror,分别对应1和2,默认只是把正确信息1流入,错误信息2需要指定。

$ ls -l > show.txt 能把列表信息打印到show.txt中。

$ ls -l suibian > show.txt 此时列举不存在的文件,show.txt中就没有打印信息。

$ ls -l suibian 2>show.txt 需要指定2,才能把错误信息流入文件。

$ ls -l suibian >show.txt 2> error.txt 所以,全面地可以out和err两个都写。

$ ls –l suibian > show.txt 2>&1 这样是1和2都输出都同一个地方,2到1嘛。



另外要体体垃圾桶“/dev/null”,我们有什么不想要就可以输出到里面。

管道
| 建立管道,改变I/O,program_1 |program_2就是将program_2的输入改成program_1的输出,建立一个虚拟的“管道”把两个文件连接起来,比使用临时文件快上10倍。

构造管道时,应该试着让每个阶段的数据量更少,过滤减少数据量移动,提高效率。例如在sort前,先grep一下,减少操作的数据量。

当然可以连接多个文件。而且还可以把各类工具串在一块使用。

cat word.txt | sort> sortWord.txt 把单词排个序,然后输出到sortWord.txt中。

Apple

Boy

Cat

Dog



tr 转换字符 : -c –C –d –s 类似于replace()和trim(),

可以进行大小写转换,删除字符,浓缩字符

tr -d'o' < trOld.txt | sort > trNew.txt

Apple

By

Cat

Dg



- 减号 管线命令
管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环。

另外,在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin ,某些指令需要用到文件名称 (例如 tar) 来进行处理时,该stdinstdout可以利用减号 "-" 来替代。



$ tar-cvf - /home | tar -xvf -

将 /home 里面的档案给他打包,但打包的数据不是纪录到文件,而是传送到stdout;经过管线后,将数据传送给后面的 tar -xvf - 。

前面的-是输出到stdout,后面的-则是从stdin中取,因此,我们就不需要使用 file 了!



tee
我们通过>和<来重导向数据,但是数据要不就流入文件,不再显示到屏幕 > < ;要不就显示在屏幕,而不流入文件 echo。这里的tee就是在传入文件的同时在屏幕上显示

-a :以累加 (append)的方式,将数据加入 file 当中!



$ ls -l | tee ls.txt

-rw-rw-r--. 1 redhat redhat 115 Oct 26 23:38 ls.txt

-rw-rw-r--. 1 redhat redhat 18 Oct 26 23:37 sortNew.txt

df /du

df (disk free)显示磁盘的相关信息,如磁盘的文件系统与使用情形。语法:df [option]

du显示当前目录下,文件和目录的大小,默认只显示目录,-a把文件也显示出来。du显示的是目录和文件大小,而df显示的是磁盘。

两者的参数几乎相同,一般[-ah]就够用了。



参数:

-a或--all 包含全部的文件系统。

--block-size=<区块大小> 以指定的区块大小来显示区块数目。

-h或--human-readable 以可读性较高的方式来显示信息。

-H或--si 与-h参数相同,但在计算时是以1000Bytes为换算单位而非1024 Bytes。

-i或--inodes 显示inode的信息。

-k或--kilobytes 指定区块大小为1024字节。

-l或--local 仅显示本地端的文件系统。

-m或--megabytes 指定区块大小为1048576字节。

--no-sync 在取得磁盘使用信息前,不要执行sync指令,此为预设值。

-P或--portability 使用POSIX的输出格式。

--sync 在取得磁盘使用信息前,先执行sync指令。

-t<文件系统类型>或--type=<文件系统类型> 仅显示指定文件系统类型的磁盘信息。

-T或--print-type 显示文件系统的类型。

-x <文件系统类型>或--exclude-type=<文件系统类型> 不要显示指定文件系统类型的磁盘信息。



ps进程

查看进程命令,运用该命令可以确定有哪些进程正在运行和运行地状态、进程 是否结束、进程有没有僵死、哪些进程占用了过多地资源等等。

也可以用top, 显示CPU等系统资源的占用情况

ps -l 显示进程占用资源 ps -l PID 能直接查询一个指定线程的情况

ps a 显示现行终端机下的所有程序,包括其他用户的程序。

ps -A 显示所有程序。

ps c 显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

ps -e 此参数的效果和指定"A"参数相同。

ps e 列出程序时,显示每个程序所使用的环境变量。

ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

ps -H 显示树状结构,表示程序间的相互关系。

ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

ps s 采用程序信号的格式显示程序状况。

ps S 列出程序时,包括已中断的子程序资料。

ps -t  指定终端机编号,并列出属于该终端机的程序的状况。

ps u  以用户为主的格式来显示程序状况。

ps x  显示所有程序,不以终端机来区分。

最常用 : ps –ef | grep “XXX”, 查找目标进程,然后再配合kill来杀掉。

kill -9 [PID] 强迫终止进程





Linux中大小写敏感



more就是先读一部分,按回车继续显示。可以在打开文件的时候使用,也可以通过管道来使用,如[ls –l |more]

less





echo会自动在行末带上换行\n

而printf不会自带换行符,使用方式和C中的类似。







PS1 提示符

提示符PS1就是命令行的最前边的[ … ],可以通过设定来显示不同的样子:

[redhat@localhost ~]$ PS1='[\u@\h \w \A #\#]\$ '

[redhat@localhost ~ 21:30 #47]$



\d :代表日期,格式为Weekday Month Date,例如 "Mon Aug 1"

\H :完整的主机名称。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名称就是 linux.dmtsai.tw

\h :仅取主机名称的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省略。

\t :显示时间,为 24 小时格式,如:HH:MM:SS

\T :显示时间,12 小时的时间格式!

\A :显示时间,24 小时格式, HH:MM

\u :目前使用者的账号名称;

\v :BASH 的版本信息;

\w :完整的工作目录名称。家目录会以 ~ 取代;

\W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。

\# :下达的第几个指令。

\$ :提示字符,如果是root 时,提示字符为 # ,否则就是 $ 啰~



$?

问号也是一个特殊的变量,里面存放了“上一个执行的指令的返回值”,就是执行一条指令后,通过这个变量可以获取执行的状态,如果成功返回0,否则为非0数,如下:

$ echo $SHELL

/bin/bash

$ echo $?

0

$ 12name=VBird

bash: 12name=VBird: command not found

$ echo $?

127



alias 别名

alias / unalias,可以自己来定义一些别名来简化命令,通过alias命令能查询现有的别名,定义:alias lm='ls -al'

$ alias

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias vi='vim'





执行跟踪

通过set -+x来开关跟踪功能,打开后会打印当前执行的命令。

$ set -x

++ printf '\033]0;%s@%s:%s\007' redhat localhost '~/jscai/bin'

$ pwd

+ pwd

/home/redhat/jscai/bin

++ printf '\033]0;%s@%s:%s\007' redhat localhost '~/jscai/bin'

$ set +x

+ set +x





参考《鸟哥的Linux私房菜》:http://download.csdn.net/detail/tiwerbao/6564193
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: