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字符,按[n]表示上一个,[N]表示下一个。
[: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) 来进行处理时,该stdin与stdout可以利用减号 "-" 来替代。
$ 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