Linux常用命令笔记-Shell

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) 来进行处理时,该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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值