`
ihyperwin
  • 浏览: 425386 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

linux 笔记

 
阅读更多
unix 文件系统两个重要概念:
1. 所有的程序或系统设备都是文件
2.不论是创建编辑器还是附属文件,所写的程序只有一个目的,而且要有效的完成目标。

linux硬盘分区
1.基本方法  /分区和swap分区两个分区
2.个性化定制
/
/usr  linux操作系统 是linux的可执行程序及放置相关文件的目录,所以它的容量需求很大。
/home  用户主目录
/var 所有默认服务器的登录文件,邮件与www默认的路径,系统默认的一些数据暂存或cache数据的存储目录
swap
/boot   100M即可,必须要在整个硬盘的最前面。

关于磁盘分区:
硬盘分为两个区域:一个是放置这个硬盘的信息区,我们称之为 主引导分区(Master Boot Recorder,MBR),一个是实际文件数据放置的地方。
MBR可以说是整个硬盘最重要的地方,因为MBR里记录了两个重要的信息:引导程序与磁盘分区表(partition table)
磁盘分区,就是修改MBR的分区表。
由于MBR 仅能保存4个分区的数据记录,如果超过4个,系统允许在额外的硬盘空间放另一份磁盘分区信息,那就是扩展分区了。扩展分区其实
就是指向“point”正确的额外分区表。
考虑到硬盘的连续性,一般建议将扩展分区放到最后面的柱面内。

引导程序可以安装在MBR,也可以安装在每个分区最前面的超级块(super block)处.

Ctrl+Alt+Backspace【退格键】 重启X window
Ctrl+Alt+[F1-F6]  切换到终端、控制台
Ctrl+Alt+F7  从控制台返回到图形界面


基础命令操作
1.date
2.cal  cal 2012    cal 12 2012
3.计算器:bc    + - * / ^ % quit   scale=number,number是小数点位数

重要的热键:
1.【Tab】 命令不全、文件补齐    在命令行模式下,按两下Tab键,可以查看有多少条命令
2.【Ctrl】-c  中断当前运行命令、程序
3.【Ctrl】-d   通常表示:“键盘输入结束:文件结束(End of File)、EOF或End of Input(输入结束) ”的意思。另外,还可以取代exit的输入。

man date
第一行,可以看到 DATE(1)  1表示“一般用户可以使用的命令”
常见数字含义如下:
1.用户可执行的命令或可执行文件
2.系统核心可调用的函数与工具等
3.一些常用的函数(function)与函数库(library)
4.设备文件的说明
5.设置文件或某些文件的格式
6.游戏(games)
7.惯例与协议等,例如 linux 标准文件系统,网络协议,ASCII码等说明内容。
8.系统管理员可以用的管理命令
9.与内核有关的文件

man -f  <--> whatis
man -k  <--> apropos

其他有用的文档  /usr/share/doc目录

关机时,注意的几件事:
who
netstat -a
ps -aux
shutdown/reboot/halt命令 在关机前已经进行了sync工具的调用,但关机器最好手动调用sync,将内存中数据写入硬盘。

用户相关信息:  /etc/passwd
用户密码:       /etc/shadow
用户组信息:    /etc/group

关于权限的一点注意:如果想对他人开放某个目录的话,请记住开放改目录的x(可执行)属性。

linux目录配置
1.linux目录配置标准FHS
  FHS(Filesystem Hierarchy Standard) 文件系统层次标准
  FHS 实际上只规范了在根目录(/)下各个主要目录应该放什么样的文件。FHS定义了两次规范,第一层是,/目录下各个目录应该放什么
  文件数据,例如/etc应该放置配置文件,/bin与/sbin则应该放置可执行文件等。第二层则是针对/usr和/var这两个目录的子目录来定义。
  例如/var/log放置系统登录文件,/usr/share 放置共享数据等。
  由于FHS仅定义出最上层(/)及子层(/usr、/var)的目录内容应该要放置的文件数据,因此,在其他子目录层内,就可以有开发人员自行配置了。
 
  文件名与完整文件名(由/开始写起的文件名)的字符限制大小为:
  单一文件或目录的最大允许文件名为255个字符。
  包含完整路径名称及目录(/)的完整文件名为4096个字符。
 
  根据FHS定义,每个目录内应该放置的文件内容如下:
 
  目录
  /      根目录是启动时系统第一个载入的分区,所以,所有启动过程中会用到的文件都放在这个分区中。举例来说,/etc、/bin、/dev、/lib、/sbin、这5个子目录都应该与根目录连在一起,不可
         独立成为某个分区。
        
          
  /boot   这个目录的主要目的是放置linux系统启动时用到的文件。启动会用到Linux的核心文件。这个目录下面的文件vmlinuz就是linux的核心。这一点非常重要。如果
           引导程序(loader)选择grub,那么这个目录内还有/boot/grub子目录
          
  /bin,/usr/bin,/usr/local/bin   放置‘用户可执行的二进制文件’  
 
  /dev   在linux系统上,任何设备都以文件类型存放在这个目录中。访问这个目录下面的某个文件,就等于访问某台设备。
 
  /etc  系统主要的设置文件几乎都放在这个目录内,例如人员的账号密码文件、各种服务的起始文件等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但只有root有权修改。在侧目录下
         的文件几乎都是ASCII的纯文本文件。FHS建议不要在这个目录中放置可执行文件。
        
  /home   这是系统默认的用户家目录(home directory).
 
  /lib,/usr/lib,/usr/local/lib  系统使用的函数库的目录。 比较重要的是/lib/modules目录内有核心的相关模块。
 
  /lost+found  系统出现异常,产生错误时,会将一些遗失的片段放于此目录下,通常这个目录会自动出现在某个分区最顶层的目录下。
 
  /mnt,/media  软盘与光盘的默认载入点。
 
  /opt   这是给主机额外安装软件存放的目录。         
 
  /proc  这个目录本身是一个“虚拟文件系统”。它放置的数据都在内存中,例如系统核心、形成信息、外部设备的状态及网络状态等。因为这个目录下的
         数据都在内存中,所以本身不占任何硬盘空间。?
        
  /root   系统管理员(root)的家目录。之所以放在这里,是因为系统第一个启动就载入的分区为/,我们希望/root能够与/放在同一分区上。
 
  /sbin,/usr/sbin,/usr/local/sbin  放一些系统管理员才会用到的执行命令。
 
  /srv   一些服务启动之后,这些服务所需要访问的数据目录。举例来说,WWW服务器需要的网页数据就可以放在/srv/www中。
 
  /tmp  这是让一般用户或者是正在执行的程序临时放置文件的地方。这个目录是任何人都能访问的,所以需要定期清理。当然,重要数据不可放在此目录中。
 
  /usr   根据FHS规范的第二层内容,在/usr目录下,包含系统的主要程序、图形界面所需要的文件、额外的函数库、本机自行安装的软件,以及共享的目录与文件。
         此目录下重要子目录有  /usr/bin,/usr/sbin,/usr/include,/usr/lib,/usr/local,/usr/share,/usr/src,/usr/X11R6
        
  /var   FHS规范的第二层目录内容。它主要放置系统执行过程中经常变化的文件。举例来说,例如cache或者随时更改的登录文件(log file)。此外,某些软件执行过程中
         会写入的数据库文件,例如MySQL数据库,也都写入这个目录中。
         主要目录如下: /var/cache,/var/lib,/var/log,/var/lock,/var/run,/var/spool
        
特殊目录:
1.建议不可与root分区分开的目录
  “一定”要放在root分区内的目录:   /etc/、/sbin/、 /bin/、/dev/、 /lib/     
  因为Linux系统在启动时,开始核心只会载入一个分区,那就是/.但是,启动的时候,会用到很多命令和函数库。
2.建议最好独立成为单一分区的目录
   有些目录由于其安全性与特殊功能,希望能够独立一个分区。如/home、/usr、/var、/tmp等。
   /home,可能是使用最频繁的目录之一。为了合理地分配资源,我们可能会限制每个人可以使用的最大硬盘配额(quota).在这个前提下,必须将/home独立
   出来,而且最好这个分区能够大一点,尤其是Linux是作为文件服务器的时候,这就更重要了。
   /usr则是一些程序安装的目录,也可以独立出来。
   /var目录,由于记录了相当多的常用数据,读取很频繁,所以是“很容易出问题的分区”。如果能够将它独立出来,那么当/var/一旦毁坏时,就不会
      会影响到其他分区,也确保了安全性。
 
 
  文件系统:
  当前的操作系统大多数是从硬盘读取数据的,每个操作系统使用的硬盘在x86架构上都一样,都是同样的硬盘。但是,每种操作系统都有其独特的读取文件的方法,
  也就是说,每种操作系统对硬盘读取的方法不同,这就产生了不同的文件系统。
 
  linux的VFS(Virtual FileSystem Switch)
  整个Linux系统都通过虚拟文件系统交换(Virtual Filesystem Switch,VFS)的核心功能去读取文件系统。也就是说,整个Linux认识的文件系统其实都是VFS在管理,用户
  并不需要知道每个分区上的文件系统是什么。VFS会主动帮我们做好读取操作。
  这无疑是一个很好用的功能。因为只要系统管理员一开始就设置好各主要文件系统对应的文件系统模块,核心的VFS就会主动接管该文件系统的访问模式。用户在不知道每个文件
  系统是什么的情况下,就能自由运用系统上的各种文件系统。
 
  执行文件路径的变量:$PATH
  在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的命令先执行。
  在PATH中哪个目录先被查询,则哪个目录下的文件就会先执行。
 
  复制、移动、删除:cp、rm、mv
 
  cp命令:复制、还可以建立连接文件(快捷方式),比较两个文件的新旧而予以更新,以及复制整个目录,等等。
  mv命令:移动目录与文件使用mv(move)命令,这个命令也可以直接用来重命名(rename).
  rm命令:(remove)命令。
 
  cp -l srcFile  dstFile   两个文件做个连接,删掉srcFile,dstFile依然可用,只是属性中连接数少1(硬连接 hard link)
  cp -s srcFile  dstFile   dstFile为srcFile的快捷方式,删掉srcFile,dstFile因找不到srcFile位置而报错。(符号连接 symbolic link)
  cp -u  srcFile  dstFile  若srcFile比dstFile新,则复制,-u 是有差异时复制,通常用于“备份”。
  cp srcFile_link dstFile_link 原本复制的是连接文件,去却将实际的文件复制过来。也就是说,如果没有加上任何参数,复制的是源文件,而非连接文件的属性。
                               若有复制连接文件的属性,就要使用-d或者-a参数。
                              
   查看文件内容:
   cat:由第一行显示文件内容
   tac:从最后一行开始显示文件内容
   nl:显示的时候,输出行号。
   more:一页一页地显示文件内容
   less:与more类似,但它可以向前翻页。
   head:只看前几行。
   tail:只看最后几行。
   od:以二进制方式读取文件内容。    
  
   touch命令最常用的情况:
   建立一个空文件;将某个文件日期修改为当前日期(mtime[内容修改时间]、atime[最近访问时间。])  
  
   不过,要注意的是,即使复制一个文件,并复制所有属性,但也没有办法复制ctime属性(状态改变时间)。
  
   文件默认权限:umask
   umask  0002  第一组是特殊权限用的。
   umask -S
  
   umask指定的是“该默认值需要减掉的权限”。因为r、w、x分别是4、2、1,也就是说,当要去掉写权限时,就输入2,要去掉读权限时,就输入4。
  
   文件隐藏属性
   chattr(设置文件隐藏属性)
   chattr [+-=] [Asacdistu] 文件或目录名
   a  设置a之后,这个文件将只能增加数据,而不能删除,只有root才能设置这个属性。
   i   i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数据".对于系统安全性有相当大的帮助。
   显示文件的隐藏属性
   lsattr(显示文件的隐藏属性)
   lsattr [-aR]  文件或目录
   -a  将隐藏文件的属性也显示出来
   -R  连同子目录的数据也一并列出来。
  
   文件特殊权限:SUID/SGID/Sticky Bit
   SUID:会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有改程序拥有者的权限。 SUID仅可用在”二进制文件(binary file)“,因为SUID是程序在执行过程中拥有文件
        拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。SUID对目录是无效的。
   SGID:如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两个方面。
        文件:如果SGID设置在二进制文件上,则不论是谁,在执行该程序的时候,它的有效用户组(effective group)将会变成改程序的用户组所有者(group id)
        目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A目录的用户组。一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。
   Sticky Bit
  
   SBit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:”在具有SBit的目录下,用户若在该目录下具有w及x权限,则当前用户在该目录是,只有文件拥有者与root才有权利删除。
  
   设置  SUID/SGID/SBIT权限
   使用数字更改权限的方式为“3个数字”组合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了。
   4为SUID;2为SGID;1为Sticky Bit
  
   搜索文件:
   通常find不常用,因为速度慢,耗费硬盘空间。通常我们先使用whereis或者locate来检查,如果真找不到,才以find来搜索。因为
   whereis与locate是使用数据库来搜索数据,快,而且并没有实际搜索硬盘,省时。
  
   1.which(寻找“执行文件”)
   which [-a] command
   -a: 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称。
  
   2.whereis(寻找特定文件)    
   whereis [-bmsu] 文件或目录名
   -b: 只找二进制文件
   -m: 只找在帮助文件manual路径下的文件
   -s: 只找源文件
   -u: 没有帮助文件的文件。
  
   Linux系统会将系统内的所有文件都记录在一个数据库文件里,当使用whereis或者locate时,都会以此数据库文件的内容为准,因此,有时您会发现,使用这两个执行文件时,会找到已删除的文件。
   而且也找不到刚刚建立的最新文件。这就是因为这两个命令是通过数据库中的结果去搜索文件。
   Linux每天会针对Linux主机上的所有文件的位置,进行搜索数据库的更新,更新的程序就是updatedb.  Fedora Core 4系统的/etc/cron.daily/slocate.cron文件记录了相关的机制。当然,也可以
   直接使用/usr/bin/updatedb来更新数据库文件。
  
   locate查找的数据是由“已建立的数据库/var/lib/slocate/ ”里面的数据所搜索到的,所以不用直接再去硬盘中访问数据,当然很快。
   可以在/etc/updatedb.conf文件内设置。建议使用默认值,不过,在/etc/updateadb.conf里,请把“DAILY_UPDATE=no” 改成“DAILY_UPDATE=yes”、
    
   find [PATH] option action
   find /  -mtime 0  将过去系统上24内更改过内容的文件列出
   find /etc -newer /etc/passwd  查找/etc下面的文件,如果文件日期比/etc/passwd新就列出来。
   find /home -user demo  搜索/home下面属于demo的文件
   find /  -name passwd  找出文件名为passwd的文件
   find /home -type f  搜索文件属性为f的文件
   find / -perm +7000  搜索文件中含有SGID/SUID/SBIT的属性。
    7000就是---s--s--t,只要含有s或t的就列出,所以要使用+7000,使用-7000表示含有---s--s--t的所有3个权限,因此,就是+7000。       
   
    
   硬盘物理组成:
   当磁头固定不动时(假设机械手臂不动),硬盘片转一圈所画出来的圆就是磁道(track)。一块硬盘里可能有多个硬盘片,所有硬盘片上相同半径的那个磁道就组成了柱面(cylinder).
   两个硬盘片上的同一磁道就是一个柱面。这个柱面也是分区时的最小单位;由圆心向外画直线,可以将磁道再细分为扇区,扇区就是硬盘片上最小的存储物理量。通常,一个扇区的大小约为
   512字节。
   在计算整个硬盘的存储量时,简单的公式就是:柱面*磁头*扇区*512字节。
  
   分区:
   分区的要点就是记录每一个分区的起始与结束柱面。记录在主引导区(Master Boot Recorder,MBR)
   事实上,MBR就是在一块硬盘的第0轨道上,这也是计算机启动之后要去使用硬盘时必须读取的第一个区域。这个区域记录了硬盘里的所有分区信息,以及启动时可以写入引导程序的位置。
  
   文件系统:
   硬盘的最小存储单位是扇区,数据所存储的最小单位并不是扇区,因为用扇区来存储效率太低。因为一个扇区只有512字节,而磁头是一个扇区一个扇区的读取,也就是说,如果文件有10MB,那么为了读取这个文件,
   磁头必须要进行(I/O)20480次。
   为了提高效率,就有了逻辑块(Block)的概念。逻辑块是在分区进行文件系统的格式化时所指定的“最小存储单位”,这个最小存储单位以扇区大小为基础(因为扇区为硬盘的最小物理存储单位),所以,块的大小为扇区的2^n倍数。
   此时,磁头一次可以读取一块,假设在格式化的时候,指定块为4KB(即由连续8个扇区构成一个块),那么,同样一个10MB的文件,磁头要读取的次数则大幅降为2560次,这就大大提高了文件的读取效率。
   不过,块的规划并不是越大越好,因为一个块最多仅能容纳一个文件。
   
   文件系统:(ext2)
   超级块 | 组描述、块位图、inode位图、inode表 | 组描述、块位图、inode位图、inode表
  
   SuperBlock(超级块):记录整个文件系统相关信息的地方。记录的信息主要有:
   块与inode的总量;未使用与已使用的inode/块的数量;一个块与一个inode的大小;文件系统的载入时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;
   有效位(valid bit)数值,若此文件系统已被载入,则有效位为0,若未被载入,则有效位为1。
   Group Description(组描述):记录此块由何处开始记录。
   Block bitmap(块位图):此处记录块是否使用
   Inode bitmap(inode位图):此处记录inode是否使用。
   Inode table(inode表) : 为每个inode的数据存放区。
   Data Blocks(数据块) : 为每个块的数据存放区。
  
   新增一个文件(目录)时:
   1.根据inode位图/块位图的信息,找到尚未使用的inode与块,进而将文件的属性与数据分别记入inode与块。
   2.将刚刚使用的inode与块的号码(number)告知超级块、inode位图、块位图等,让这些元数据更新信息。
  
   一般来说,我们将Inode表与块区域称为数据存放区,其他的诸如超级块、块位图与inode位图等记录称为元数据(metadata)。
    列出inode
      ls  -lia /
      ls -liad /etc/.
      ls -lid /
      
  
  
  
   linux文件系统的运行
   为了让Linux加快整个系统的访问速度,Linux通常采取异步处理(asynchronously)的方式。
   当系统读取了某个文件,则该文件所在的块数据会加载到内存中,所以该磁盘块就会放在主存储器的缓冲区中。若这些块的数据被改变时,刚开始只有主存储中的
   块数据会被改变,而且在缓冲区的块数据会被标记为“脏(dirty)”,这个时候,磁盘实体块尚未被修正,所以,这些“脏”块的数据必须回写到磁盘中,以维持磁盘实体块上的数据
   与主存储器中的块数据的一致性。
  
   载入点一定是“目录”而不是文件。也就是说,载入点就是进入该文件系统的入口。
  
   cat /proc/filesystems
  
   磁盘与目录的容量:
   1.df  [-ahikHTm] [目录或文件名]
   -a : 列出所有的文件系统,包括系统特有的/proc等文件系统。
   -i : 不用硬盘容量,而以inode的数量来显示。
   -h :以GB、MB、KB等格式显示。
  
   2.du  列出当前目录下的所有文件的总容量
   du [-ahskm] 文件或目录名称
  
   连接文件:ln
   分为硬链接和符号连接两种。

   ln  [-sf] 源文件 目标文件
   -s : 如果ln不加任何参数就进行连接,那么就是硬链接,-s就是符号连接
   -f : 如果目标文件存在时,就主动将目标文件直接删除后再建立。
  
   分区: fdisk
   fdisk [-l] 设备名称
   -l: 输出后面接的设备所有的分区内容。若仅有fdisk -l 时,将会把整个系统内能够搜索到的设备分区均列出来。
  
   可以利用mount将某个目录载入到另一个目录。这并不是载入文件系统,而是额外地载入某个目录的方法。
   通过 mount --bind的功能,可以将某个目录载入到其他目录,而并不是整块文件系统。
   mount --bind /home /tmp/home  将/home目录暂时载入到/tmp/home目录
  
   umount(卸载设备文件)
   直接将载入的文件系统卸载掉。卸载之后,可以使用df看看是否还存在。也可以使用-f参数将想要卸载的分区强制卸载。可以通过
   设备(如/dev/hdb5)或载入点 (如/mnt/hdb5)完成卸载。
   umount 设备号或载入点
   umount /dev/hdb5
   umount /mnt/hdb5
  
   mount -t ext2 /dev/fd0 /mdia/floppy
   mount -t vfat /dev/fd0 /media/floppy
   umount /mdia/floppy
  
   一定要将/media/floppy卸载之后才可以取出,否则系统会一直告诉您将发生错误。当卸载/media/floppy的时候,一定不能在
   该目录中,否则会发生错误信息。
  
   启动载入 /etc/fstab 和 /etc/mtab
   系统载入限制:
   1.根目录/是必须载入的,而且一定要先于其他载入点被载入
   2.其他载入点必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录结构原则;
   3.所有载入点在同一时间之内,只能载入一次;
   4.所有分区在同一时间之内,只能载入一次;
   5.若进行卸载,必须先将工作目录移到载入点(及其子目录)之外。
     
  
   文件的压缩与打包
  
   *.Z : compress程序压缩的文件;
   *.bz2 : bzip2程序压缩的文件;(压缩比更好的压缩命令)
   *.gz : gzip(GNU zip)程序压缩的文件
   *.tar : tar程序打包的数据,并没有压缩过;
   *.tar.gz : tar程序打包的文件,半年过去经过gzip的压缩。
  
   在类UNIX的软件中,tar程序可以将很多文件“打包”为一个文件。甚至对目录也可以这样做。不过,单纯的tar功能仅是“打包”而已,即将很多文件聚集为一个文件,事实上,它并没有
   提供压缩功能,后来,GNU计划中,将整个tar与压缩的功能结合在一起,提供给用户更方便且更强大的压缩与打包功能。
  
   1.compress
  
   2.gzip、zcat
   gzip [-cdt#] 文件名
   zcat 文件名.gz
  
   -c: 将压缩的数据输出到屏幕上,可通过数据流重导向来处理。
   -d : 解压缩的参数。
   -t : 可以用来校验一个压缩文件的一致性,看文件有无错误。
   -# : 压缩等级,-1最快,但是压缩比最差,-9最慢,但是压缩比最后,默认是-6
  
   gzip是用来替代compress的,所以gzip -d 可以用来解压缩compress压缩过的文件(*.Z),用zcat也可以查看(*.Z)
  
   3.bzip2、bzcat
   bzip2 [-cdz] 文件名
   bzcat 文件名.bz2
   -c:将压缩过程产生的数据输出到屏幕上。
   -d:解压缩的参数
   -z:压缩的参数
   -#:与gzip同样,都是计算压缩比的参数,-9最佳,-1最快。
  
   4.tar
   tar [-cxtzjvfpPN] 文件与目录 ...
   -c : 建立压缩文件的参数命令(create的意思)
   -x: 解压缩文件的参数命令。
   -t : 查看tarfile里的文件。特别注意,在使用参数是,c/x/t只能有一个,不可同时存在,因为不可能同时压缩与解压缩。
   -v : 压缩的过程中显示文件。这个常用,但不建议用在后台执行过程。
   -p : 使用原文件的原来属性(属性不会根据用户而变)
   -f: 使用文件名,请注意,在f之后要立即接文件名。不用再加参数。
   -z : 是否同时具有gzip的属性?即是否需要用gzip压缩
   -j : 是否同时具有bzip2的属性?即是否需要用bzip2压缩
   --exclude FILE : 在压缩的过程中,不用将FILE打包。
  
   将整个/etc目录下的文件全部打包成为 /tmp/etc.tar
   tar -cvf /tmp/etc.tar  /etc   仅打包,不压缩
   tar -zcvf /tmp/etc.tar.gz /etc  打包后,以gzip压缩
   tar -jcvf /tmp/etc.tar.bz2 /etc 打包后,以bzip2压缩
  
   查看/tmp/etc.tar.gz
   tar -ztvf /tmp/etc.tar.gz
  
   备份/etc/内的所有文件,并且保存其权限
   tar -zxvpf /tmp/etc.tar.gz /etc    #-p的属性,会保留原文件的属性。
  
   在/home中,比2005/06/01新的文件才备份
   tar -N '2005/06/01' -zcvf home.tar.gz /home
  
   我要备份/home,/etc,但不要 /home/dmtsai
   tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/*  /etc
  
   将/etc打包后直接在/tmp中解压缩,而不产生文件。
   tar -cvf - /etc | tar -xvf -
   #这个有点像是cp -r /etc /tmp,是有其用途的。要注意的地方在于输出文件变成-,而输入文件也变成-,又有一个|存在。这分别代表standard output(标准输出),stardard input(标准输入)与管道命令。
  
  
   compress与gzip等可以用在一个文件的压缩上,但如果是要将一个目录压缩成一个文件,用tar。tar可以将整个目录或者是指定的文件都整合成一个文件。
   同时,tar可以配合gzip(gzip的功能已经附加到tar里了),同时整合并压缩,很方便。tar是很重要的备份命令。
  
   dd:
   dd命令不只是用来制作一个文件,其最大的作用,应该是用于“备份”。因为dd可以读取设备的内容,然后将整个设备备份成一个文件。
  
   dd if=/dev/zero of=/tmp/swap bs=4k count=16382
   dd命令是用来转换文件并且用于复制。
   if指的是要转换的输入文件格式 /dev/zero 可以由 man zero 来查看内容。也可以是设备。
   of 指的是输出文件,我们将之输出到/tmp/swap文件。也可以是设备。
   bs 指的是一个分区占用多少KB。规划一个块的大小,如果没有设置时,默认是512字节。
   count 指要使用多少个bs,所以最后的容量为bs*count=4k*16382~64MB
  
   将 /etc/passwd 备份到 /tmp/passwd.back中
   dd if=/etc/passwd of=/tmp/passwd.back
  
   备份/dev/hda 的MBR
   dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1
  
   备份整个 /dev/hda1 分区
   dd if=/dev/hda1 of=/some/path/filename
  
   tar可以用来备份关键数据,而dd则可以用来备份整个分区或者整个磁盘。不过,如果要将数据填回到文件系统中,可能需要考虑到原来
   的文件系统才能成功。
  
   cpio
  
   cpio -covB > [file|device]   #备份
   cpio -icduv < [file|device]  #还原
  
  
   这个命令是通过数据流重导向的方法,将文件进行输出/输入的一种方式。
   命令cpio很神奇,它最适合备份时使用。由于cpio无法直接读取文件,而需要“每一个文件或目录的路径连同文件名一起”才可以记录下来,因此,cpio常与
   find命令一起使用。
   它可以备份任何文件,包括/dev中的任何设备文件,所以相当重要。由于cpio必须配合其他程序,例如find来建立文件名,所以,cpio与管道命令及数据流重导向的相关性相对重要。
  
  
   vi
   一般模式:
  
   光标移动:
   n<space> 光标向右移动这行的n个字符
   0 移动到这一行的最前面字符
   $ 移动到这一行的最后面字符
   H 移动到屏幕最上方那一行
   M 移动到屏幕中央那一行
   L 移动到屏幕最下面那一行
   G 移动到这个文件的最后一行
   nG 移动到这个文件的第n行(可配合 :set nu)
   gg 移动到这个文件的第1行,相当于1G
   n<Enter> 光标向下移动n行
  
   搜索
   /word
   ?word
   n 重复前一个搜索的动作
   N 反向进行前一个搜索的动作。
  
   删除、复制与粘贴
   x,X   x向后删除一个字符,X向前删除一个字符
   dd    删除光标所在的行
   d1G   删除光标所在位置到第一行
   dG    删除光标所在位置到最后一行
   d$    删除光标所在位置到该行的最后一个字符
   d0    删除光标所在位置到该行的第一个字符
   yy    复制光标所在位置的那一行
   y1G   复制光标所在位置到第一行
   yG    复制光标所在位置到最后一行
   y0    复制光标所在位置到该行的第一个字符
   y$    复制光标所在位置到该行的最后一个字符
   p,P   p将已复制的数据,粘贴到光标的下一行,P则为上一行
   J     将光标所在行与下一行的数据合并成同一行
   u    复原前一个操作
   [Ctrl]+r  重做上一个操作
   .    重复前一个动作
  
   编辑模式
   i,I   插入:在当前光标所在处插入输入文字,已存在的文字会向后退;其中,i为“从当前光标所在处插入”,I为“在当前所在行的第一个非空格处开始插入”
   a、A  a为“从当前光标所在的下一个字符处开始插入”,A为“从光标所在行的最后一个字符处开始插入”
   o、O  o为“在当前光标所在的下一行处插入新的一行”;O为“在当前光标所在的上一行处插入新的一行”
   r、R  替换:r会替换光标所在的那一个字符;R会一直替换光标所在的文字,直到按下Esc键为止。
   Esc   退出编辑模式,回到一般模式中。
  
   命令行命令模式
   :w   将编辑的数据写入硬盘文件中
   :w!  若文件属性为“只读”时,强制写入该文件。不过,到底能不能写入,与文件权限有关。
   :q  离开vi
   :q! 强制离开不存储文件
   :wq  存储后离开
   ZZ  若文件没有更改,则不存储离开,若文件已经更改,则存储后离开。
   :w[filename] 将编辑的数据存储成另一个文件(类似另存新文件)
   :r[filename] 在编辑的数据中,读入另一个文件的数据。即将“filename”这个文件内容加到光标所在行的后面。
   :n1、n2 w[filename] 将n1到n2的内容存储成filename文件
   :! command  暂时离开vi到命令行模式下执行command的显示结果。例如“:! ls /home”,即可以在vi中查看/home中以ls输出文件信息
   :set nu    显示行号
   :set nonu   取消行号
  
   DOS与Linux的换行符
  
   dos2unix [-kn] file [newfile]
   unix2dos [-kn] file [newfile]
  
   -k:保留该文件原来的mtime时间格式
   -n:保留原来的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new
  
  
   BASH的主要优点:
   1.命令记忆能力   .bash_histroy  history
   2.命令与文件补全功能   【Tab】键
   3.命令别名(alias)设置功能
   4.作业控制(jobs)、前台、后台控制
   5.Shell scripts的强大功能
   6.通配符
  
   Bash Shell的内置命令:type
   type命令可用来观察: 输入的命令是来自于外部命令(指的是其他非bash套件所提供的命令)或是内置在bash中的
   type [-tpa] name
    :不加任何参数时,type会显示出name是外部命令还是bash内置的命令。
    -t: 加入-t参数时,type 会将name通过下面这些文字显示出它的意义
               file:外部命令
               alias:为命令别名所设置的名称
               builtin:该命令为bash内置的命令功能。
    -p: 如果后面接的name为命令,会显示完整文件名(外部命令)或显示为内置命令
    -a: 在PATH变量定义的路径中,列出所有含有name的命令,包括alias
   
    由于type搜索后面的名称时,如果后接的名称并不能以执行文件的状态找到,那么,改名称时不会显示出来的。所以type可以用来
    查找命令(type -p name),类似which命令。 
   
   
    " 双引号,部分引用.  "STRING"阻止了一部分特殊字符
    ‘ 单引号,全引用.    'STRING'阻止了全部特殊字符
    ‘后置引用,命令替换
   
    在变量的设置中,单引号与双引号的最大不同在于,双引号仍然可以保持变量的内容,但单引号内只能是一般字符,而不会有特殊符号。
    name=test
    echo $name                test
    myname="$name its me"    
    echo $myname             test its me
    myname='$name its me'
    echo $myname              $name its me
    使用单引号的时候,$name将失去原有的变量内容,仅为一般字符的显示类型而已。
   
    在执行命令的过程中,引号(`),数字1左边的倒引号,代表的含义:
    在一串命令中,`之内的命令将先执行,而其执行出来的结果将作为外部输入信息。可以利用$()来替换。
     ls  -l  `locate crontab`
    
     环境变量:
     1.env  
     2.set (set is a shell built-in)
    
     比较重要的变量
     PS1(提示符的设置),这里是数字1不是英文字母。
     $ (关于本shell的PID),想要知道shell的PID,使用echo $$即可。
     ?(上一个执行命令的回传码)一般来说,如果成功执行该命令,则会回传一个0值,如果执行过程发生错误,就会回传“错误代码”,通常以非0值来替换。
     OSTYPE,HOSTTYPE,MACHTYPE(主机硬件与核心的等级)
    
     自定义变量转换成环境变量:export
     两者不同之处,在于变量是否可以被子程序所引用。环境变量可以,而自定义变量不可以。
    
     语系文件的变量(locale)
     locale -a  支持所有的语系
    
     变量键盘读取、数组与声明: read、array、declare
    
     read [-pt] variable
     -p:后面可以接提示符
     -t:后面可以接等待的“秒数”。这个比较有意思。不会一直等待用户。
    
     让用户通过键盘输入内容,将该内容变成atest变量
     # read atest
     this is a test
     # echo $atest
     this is a test
    
     2.declare/typeset
     declare或typeset的功能一样,就是在声明变量的属性。如果使用declare,后面没有任何参数,那么bash就会主动将所有变量名与
     内容都调出来,就好像set一样。
    
     declare [-aixr] variable
     -a: 将后面的variable定义为数组(array)
     -i: 将后面的variable定义为整数数字(integer)
     -x: 用法与export一样,就是将后面的variable变成环境变量。
     -r: 将一个variable的变量设置成只读(readonly),该环境不可更改内容,也不能取消设置(unset)
    
     与文件系统及程序的限制关系:ulimit
         bash可以“限制用户的某些系统资源”,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总量。
         ulimit [-SHacdflmnpstuv] [配额]
         -H: hard limit,严格设置,必定不能超过设置的值。
         -S:  soft limit,警告设置,可以超过,但会有警告消息。
        
         列出所有的限制数据
         ulimit -a
         限制用户仅能建立1MB以下容量的文件
         ulimit -f 1024    `  


.命令等级于source命令。这是一个bash的内建命令
.作为文件名的一部分。如果作为文件名的前缀的话,那么这个文件将成为隐藏文件。将不被ls命令列出。
.字符匹配,这是作为正则表达式的一部分,用来匹配任何的单个字符
: 空命令,等价于"NOP"(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令(true)作用相同
":" 命令是一个bash的内建命令,它的返回值为0,就是shell返回的true
: if/then中的占位符,如 if condition  then:  #什么都不做,引出分支   
                        else take some action   
                        fi
cat /dev/null    >data.xxx 清空data.xxx文件
内建命令不会产生一个新的进程    


个人设置值:
~./bash_profile,~/.bash_login,~/.profile
这三个文件通常只要一个即可,一般默认是以~/.bash_profile文件名存在。这个文件可以定义个性化的路径(PATH)与环境变量,等等。不过,
还是有顺序上的差异,bash启动时,会先去读取~/.bash_profile,找不到时,就去读取~./bash_login,然后才是~/.profile
注意,这三个文件只有在登录时才读取一次。
~/.bashrc
建议一般在这个进行个性化设置。例如命令别名、路径等。在每次执行shell脚本的时候,都会重新读取这个文件,所以是最完整的。
~/.bash_histroy
历史命令记录在此。每次登录bash后,bash就会先读取这个文件,将所有命令读入内存。
~/.bash_logout
这个文件记录“当我注销bash后,系统在帮我做完什么操作后才离开”。可以读取这个文件的内容,默认情况下,注销时,bash只是清掉屏幕的消息。


在变量的设置规范中,后输入的设置值可以替换先输入的设置值,那么,在我们登录bash的时候,这些设置文件到底是如何读取的呢?
1.先读取/etc/profile,再根据/etc/profile的内容去读取其他附加的设置文件。例如/etc/profile.d与/etc/inputrc等设置文件。
2.根据不同的用户,到用户家目录下读取~/.bash_profile或~/.bash_login或~/.profile等设置文件。
3.根据不同的用户,到家目录区读取~/.bashrc
所以,登录bash后,最终读取的设置文件是~/.bashrc。也就是说,在~/.bashrc里的设置会是最终的设置值。

利用source或小数点(.),都可以将设置文件的内容读进到当前的shell环境中。

登录shell与非登录shell
登录与非登录shell的差异,除了取得的时机不同之外,他们读取的环境设置文件也不相同。当登录linux,即使取得登录shell时,会读取
~/.bash_profile、~/.bash_login、~/.profile,这3个文件的优先级已经提过。至于在取得登录shell后,继续操作的其他非登录shell,读取
的文件仅有 ~/.bashrc。而大部分的linux版本都会将~/.bash_profile的内容指到~/.bashrc,这样比较简单。

重定向:
find /home -name testing > list_right 2> list_error
find /home -name testing > list_right 2> /dev/null
把所有的数据都写到同一个文件中,写法如下:
find /home -name testing > list 2>&1
写入同一个文件需要使用2>&1

<  "将原本需要由键盘输入的数据,通过文件来读取"

command1 && command2 || command3

&& 当前面的命令执行结果为正确时,就可以接着执行后续命令,否则就略过。
|| 与 && 刚好相反,当前一个命令有错误时,才会执行||后面的命令。
若command1命令正确,则执行command2(command2是肯定正确的命令),所以不会执行command3的命令
若command2命令错误,则略过command2命令,执行command3命令
实际效果:若command1正确,则执行command2,否则执行command3

管道命令(pipe)
ls -al /etc | less
管道命令“|”仅能处理通过前面一个命令传来的正确信息,也就是标准输出(STDOUT)的信息,对于标准错误,并没有直接处理的能力。
在每个管道的前后都是“命令”。后一个命令的输入是前一个命令的输出。不过要注意,在linux中,很多消息处理都是以“行”为单位。
也就是以是否具有【Enter】标志(CR)来作为一段处理的根据。

选取命令:cut、grep
1.cut 处理的消息是以“行”为单位。
cut -d'分隔符' -f fields
cut -c 字符范围

参数:
-d : 后面接分隔符。与-f一起使用
-f : 根据-d的分隔符将一段消息分为数段,用-f取出第几段的意思。
-c : 以字符(characters)为单位取出固定的字符范围。

echo $PATH | cut -d ':' -f 5  以:分隔的第5段
echo $PATH | cut -d ':' -f 3,5  以:分隔的第5段和第3段
export  | cut -c 12- 将export输出的消息,取得第12个字符以后的所有字符串

cut主要的用途在于,将“同一行里的数据进行分解”。最常用在分析数据或文字数据的情况。
分析log文件的时候常用cut。不过,cut在处理多空格相连的数据时,可能会比较吃力。

2.grep
cut是将一行消息中取出我们想要的部分,grep则是分析一行消息,若其中有所需要的信息,就将该行取出。
grep [-acinv] '搜索字符串' filename
参数:
-a : 将二进制文件以文本文件的方式搜索数据
-c : 计算找到'搜索字符串'的次数
-i : 忽略大小写的不同,所有大小写视为相同
-n : 顺便输出行号
-v : 反向选择,即显示出没有‘搜索字符串’内容的那一行。

last | grep 'root'
last | grep -v 'root'

last | grep 'root' | cut -d ' ' -f1   在last的输出消息中,只要有root就取出,并且仅取第一栏

排序命令: sort 、 wc、uniq
1.sort
sort [-fbMnrtuk]   [file or stdin]
-f:忽略大小写的差异
-b:忽略最前面的空格符
-M:以月份的名字来排序
-n:使用“纯数字”进行排序
-r:反向排序
-u:uniq,相同的数据仅出现一行
-t:分隔符,默认是tab键
-k:按那个字段来排序

2.uniq
uniq [-ic]
-i:忽略大小写
-c:进行计数

3.wc
  可以计算输出消息的整体数据
wc  [-lwm]
-l : 仅显示多少行
-w : 仅显示多少字(英文单词)
-m :多少字符。

cat /etc/man.config | wc
138   709  4506
#输出的3个数字中,分别表示:“行数、字数、字符数”
wc是相当有用的计算文件内容的工具。举个例子来说,要知道当前账号文件中有多少账号时,就使用此法:“cat /etc/passwd | wc -l” .

双向重导向:tee
同时将数据流分送到文件和屏幕;而输出到屏幕的,其实就是stdout,可以让下个命令继续处理。
tee [-a] file
-a: 以累加(append)的方式,将数据加入file中

last | tee last.list | cut -d " " -f1
#这个范例可以让我们将last的输出存一份到last.list文件中

字符转换命令:tr、col、join、paste、expand

tr: tr可以用来删除一段消息中的文字,或者进行文字消息的替换。
tr [-ds]  SET1
-d: 删除消息中的SET1字符串
-s : 替换重复的字符。

将last输出的消息中,所有小写变成大写字母:
last | tr '[a-z]' '[A-Z]'
将/etc/passwd输出消息中的冒号(:)删除
cat /etc/passwd  | tr -d ':'

col [-x]
参数:
-x : 将tab键转换成对等的空格键
cat -A /etc/man.conf  #此时会看到很多 ^I的符号,那就是tab
cat /etc/man.config | col -x | cat -A | more    #如此一来,tab按键会被替换成空格键,输出就美观多了

join
join是在处理两个文件之间的数据,而且,主要是在处理 两个文件中,有“相同数据的行”,将他们加在一起。
join [-ti12] file1 file2
参数:
-t : join默认以空格符分隔数据,并且比较“第一个字段”的数据,如果两个文件相同,则将两个数据联成一行,且第一个字段放在第一个。
-i : 忽略大小写的差异。
-1 : 数字1。表示“第一个文件要用那个字段来分析”的意思。
-2 : 表示“第二个文件要用那个字段来分析”的意思。

join -t ':' /etc/passwd /etc/shadow

/etc/passwd第四个字段是GID,GID记录在/etc/group中的第三个字段,如何将两个文件整合?
join -t ':' -1 4 /etc/passwd -2 3 /etc/group
join在处理两个相关的数据文件时,很有帮助

paste
paste就要比 join简单多了。相对于join必须要比较两个文件的数据关联性,paste就直接“将两行贴在一起,且中间以【tab】键隔开”而已。

paste [-d] file1 file2
-d : 后面可以接分隔符。默认以tab键来分隔。
- : 如果file 部分写出 - ,表示来自标准输入的数据。

将/etc/passwd 与/etc/shadow 同一行贴在一起
paste /etc/passwd /etc/shadow
先将/etc/group读出(用cat),然后与范例一贴在一起,且仅取出前3行
cat /etc/group | paste /etc/passwd /etc/shadow  -  | head -n 3  #这个例子的重点在-的使用上。常常表示stdin.

5.expand
就是将【tab】按键转成空格键。
expand [-t] file
-t : 后面可以接数字。一般来说,一个tab按键可以用8个空格键来替换。也可以自行定义一个【tab】按键表示多少个字符。

grep '^MANPATH' /etc/man.config | head -n 3 | expand -t 6 - | cat -A

拆分命令:split
split 可以将一个大文件,根据文件大小或行数来拆分,将大文件拆分为小文件,快速又有效。

split [-bl] file PREFIX
-b: 后接要拆分的文件大小,可加单位,例如b,k,m等
-l: 按行数进行拆分。

cd /tmp; split -b 300k /etc/termcap termcap ;ls -l termcap*

#文件名可以随意取的。只要写上前导文字,就会以xxxaa,xxxab,xxxac等方式来建立小文件。

将上面的文件合成一个文件,文件名为termcapback,用数据流重导向。
cat termcap* >> termcapback

使用ls -al / 输出的信息中,每10行记录成一个文件
ls -al / | split -l 10 - lsroot
#重点在-,stdin或stdout

参数代换: xargs
产生某个命令的参数。 xargs可以读入stdin的数据,并且以分隔符或换行符作为标识,将stdin的数据分割成为参数。

xargs [-0apn] command

-0: 如果输入的stdin含有特殊字符,例如`,\,空格键等字符,这个-0参数可以还原成一般字符。这个参数可以用于特殊状态。
-e: 这是EOF的意思。后接一个字符串,当xargs分析到这个字符串时,就会停止继续工作。
-p: 在执行每个命令的参数时,都会询问用户的意思。
-n : 后面接次数,每次command命令执行时,要使用几个参数。
当xargs后面没有接任何命令时,默认是以echo进行输出。

正则表达式:
正则表达式就是处理字符串的方法,以行为单位进行字符串的处理,通过一些特殊符号的辅助,可以让用户轻松搜索/替换某特定字符串。

利用[]来搜索集合字符

grep -n 't[ae]st' regular_express.txt

[]中不论有几个字符,都只代表“一个”字符,所以,上面的例子说明,我们需要的只是“tast”或“test”两个字符串。

grep -n '[^g]oo' regular_express.txt
#搜索oo字符串,且之前不能有g, [^]集合的反向选择。

grep -n '[^a-z]oo' regular_express.txt #oo前面不想有小写字母

grep -n   '[a-zA-Z0-9]' regular_express.txt

行首与行尾字符^$

grep -n '^the' test.txt
grep -n '^[a-z]' test.txt
grep -n '^[^a-zA-Z]' test.txt #开头不为英文字母的行,^符号,在[]中代表"反向选择",在[]之外则代表定位在行首。

#行尾结束为小数点(.)的一行
grep -n '\.$' regular_express.txt #转义小数点,解除其特殊意义。

grep -n '^$' test.text  # 找出空白行

grep -v '^$' /etc/syslog.conf | grep -v '^#'  #去除空白行,去除注释行

任意一个字符(.)与重复字符(*)
正则表达式当中的(.)代表“绝对有一个任意字符”意思。
grep -n "g..d" test.txt

(*) 在正则表达式中表示“重复0个或多个前面的RE字符”,因此,(o*)表示“拥有空字符或一个o以上的字符”。
特别注意,因为允许空字符串(就是不管是否有字符都可以的意思),因此,grep -n 'o*' test.txt将会把所有的数据都显示在屏幕上。

如果是(oo*),第一个o肯定存在,第二个o是可有可无的,所以凡是含有一个及一个以上的o都可以列出来。
同理,当需要至少两个o以上的字符串时,就需要ooo*

#字符串开头和结尾都是g,但两个g之间仅能存在至少一个o,即gog、goog等。
grep -n 'g.*g' test.txt
因为*可以是0或多个重复前面的字符,而.是任意字符,所以“.*代表零个或多个任意字符“

# 注意:*在通配符和正则表达式中的意思是不一样的。

限定连续重复字符范围{}
如果想限制一个范围内的重复字符数,要使用限定范围字符{}。
因为{}与}的符号在shell有特殊的意义,因此要使用转义符\让它失去特殊意义。

#要找出两个o的字符串
grep -n 'o\{2\}' test.txt

grep -n 'go\{2,5\}g' test.txt

grep -n 'go\{2,\}g' text.txt  #找出两个o以上的字符

重要特殊字符(characters)
^word  待搜索的字符串(word)在行首
word$  待搜索的字符串(word)在行尾
.    代表”任意一个“字符,一定是一个任意字符,空格符也是字符。
\   转义符,将特殊符号的特殊意义去除
* 重复零个或多个的前一个重复字符
\{n,m\} 连续n到m个的”前一个重复字符“  ,若为\{n\}则是连续重复n个前一个字符,若是\{n,\}则是连续重复n个以上前一个字符
[]  字符集合的重复特殊字符的符号, 在[]中仅代表一个待搜索的字符, 需特别注意的是,在字符集合[]中的减号是有特殊意义的,它
代表两个字符之间的所有连续字符。但连续与否与ascii编码有关,因此编码需要设置正确(在bash中,需要确定LANG与LANGUAGE的变量是否正确)

注意:通配符中的*和正则表达式中的*并不相同,另外,通配符的反向选择为[!range],正则表达式则是[^range]

扩展正则表达式
grep -v '^$' text.txt | grep -v '^#'   #使用管道命令来搜索两次
egrep -v '^$|^#' test.txt       #使用支持扩展型正则表达式的egrep与特殊字符|来分隔两组字符串,会方便很多。

grep支持基础正则表达式,而egrep支持扩展正则表达式。egrep是grep -E的命令别名

扩展正则表达式的特殊符号:
+  重复”一个或一个以上“的字符。
? ”0个或一个字符“
|  用或(or)的方式找出数个字符串
()  找出”用户组“字符串。

egrep -n 'g(la|oo)d' text.txt
echo 'AxyzxyzxyzC'  | egrep 'A(xyz)+C'    #找开头是A,结尾是C,中间有一个以上的”xyz“字符串。

注意: !在正则表达式中并不是特殊字符。



printf

printf '%10i %5i %5i %8.2f \n' `cat printf.txt | grep -v Name`

printf '\x45\n'   #列出45代表的字符是什么

sed工具
   sed可以分析标准输入(stdin)的数据,然后将数据经过处理后,再将它输出到标准输出(stdout)。它有替换、删除、新增、选取特定行等处理功能。
  
   sed [-nefr] [动作]
   -n : 使用安静(silent)模式。在一般sed的用法中,所有来自stdin的数据一般都会显示在屏幕上。但如果加上-n参数,则只有经过sed特殊处理
       的那一行才会列出来。
   -e : 直接在命令行模式上进行sed的操作编辑。
   -f : 直接将sed的操作写在一个文件内,-f filename 则可以执行filename内的sed操作。
   -r : sed的操纵支持的是扩展正则表达式的语法(默认是基础正则表达式语法)
  
   操作说明:[n1[,n2]] function
   n1,n2 : 不一定存在,一般代表”选择进行操作的行数“,举例来说,如果操作需要在10到20行之间进行,则”10,20[操作行为]“
  
   function有下面这些操作:
   a : 新增,a的后面可以接字符串,而这些字符串会在新的一行出现(当前的下一行)
   c : 替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行。
   d : 删除,因为是删除,所以d后面通常不接任何内容。
   i : 插入,i的后面可以接字符串,而这些字符串会在新的一行出现(当前的上一行)
   p : 打印,即打印某个选择的数据。通常p会与参数 sed -n 一起运行。
   s : 搜索,不但可以搜索,还能进行替换。通常s操作可以与正则表达式一起使用。
  
   显示/etc/passwd的内容,并且需要打印行号,同时,将2-5行删除。
   nl /etc/passwd | sed '2,5d'
    nl /etc/passwd | sed '2,$d'  #删除2行到最后一行
   
  
    nl /etc/passwd | sed '2a drink tea' # 在第二行后,加上drink tea字样
    nl /etc/passwd | sed '2i drink tea' # 在第二行前,加上drink tea字样
   
    将第2——5行的内容替换为”No 2-5 number“
    nl  /etc/passwd | sed '2,5c No 2-5 number'
   
    仅显示5~7行
    nl /etc/passwd | sed -n '5,7p'
   
    在/etc/man.config文件中,将有MAN的设置取出,但不要说明内容。
    cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
   
    awk工具简介
    与sed常常作用于整行处理相比,awk比较倾向于一行中分成数个”字段“来处理,因此,awk适合处理小型的数据。awk通常的运行模式
    是这样的:
   
    awk '条件类型1{动作1} 条件类型2{动作2} ...' filename
   
    awk可以处理后续文件,也可以读取来自当前一个命令的标准输出。awk主要是处理“每一行字段内的数据”,而默认的“字段分隔符”为
    空格键或tab键。
   
    awk是“以行为单位处理”,而“以字段为最小的处理单位”。
    awk的内置变量:
    NF : 每一行($0)拥有的字段总数
    NR : 当前awk所处理的是“第几行”数据。
    FS : 当前的分隔符,默认空格键。
   
    last | awk '{print $1 "\t lines: " HR "\t columes : " NF}'
   
    cat /etc/passwd | awk 'BEGIN (rs=":") $3 < 10 (print $1 "\t " $3)'
   
    文件数据比较与显示的相关功能
   
    文件比较 deff
    diff用于比较两个文件之间的不同,一般用在ASCII纯文本文件。
   
    diff  [-bBi] from-file to-file
    参数:
    from-file : 一个文件名,作为原始比较文件的文件名。
    to-file :  一个文件名,作为目的比较文件的文件名。
    注意,from file或to-file可以-替换,代表“标准输入或标准输出”
   
    -b  : 忽略一行中的多个空白的差异
    -B  : 忽略空白行的不同
    -i : 忽略大小写的不同
   
    diff  /etc/passwd  /tmp/test/passwd
   
    diff /etc /tmp/test
   
    diff还可以比较不同目录相同文件名的内容
   
    cmp
    cmp没有diff的用途广泛。cmp主要是用于比较两个文件,它主要用“位”为单位去比较,因此,可以比较二进制文件。
    diff主要是以“行”为单位比较,cmp则是以“位”为单位比较,这并不相同。
   
    cmp [-s] file1 file2
    参数: -s  : 将所有不同的位都列出来。因为cmp默认仅会输出第一个发现的不同的。
   
    patch
   
    patch命令与diff命令密不可分。
   
    diff来比较两个文件之间的不同,进一步使用这个功能来制作补丁文件(patch file),以便更容易进行比较与升级。
   
    文件打印准备: pr
    pr /etc/man.config
   
   
    Shell脚本
   
    虽然shell脚本号称是程序(program),但实际上,shell脚本处理数据的速度不是很快。由于shell脚本用的是外部命令与
    bash shell的一些默认工具,所以,它常常会去调用外部函数库,因此,运算速度比不上传统的程序语言。shell脚本用在系统管理上是
    很好的工具,但用在处理大量数值运算上就不够了,而且还很麻烦,因为shell脚本的速度较慢,且占用的cpu资源较多,造成主机资源
    分配不足。但很少有使用shell脚本进行大量数据运算的情况。
   
    条件判断:
    if [条件判断表达式];  then
        当条件判断表达式成立时,可以执行的命令。
    fi   
   
    if [条件判断表达式一]; then
        当条件判断表达式一成立时,可以执行的命令
    elif [条件判断表达式二]; then
        当条件表达式二成立时,可以执行的命令
    else        
        当条件表达式一与二均不成立时,可以执行的命令。
    fi
   
    case...esac
   
    case $变量名称 in
      "第一个变量内容")
         程序段
            ;;
       "第二个变量内容")
            程序段
            ;;
        *)
             不包含第一个变量内容与第二个变量内容的其他程序执行段
             exit 1
             ;;
        esac
       
        使用函数功能
         function fname(){
              程序段
         }          
        
         循环:
        
         "当condition条件成立时,就进行循环,直到condition的条件不成立才停止"    
        
         while [ condition ]       
         do
               程序段落
         done
        
         当condition条件成立时,就终止循环,否则就持续执行循环的程序段
        
         until [ condition ]
         do
            程序段落
         done
        
        
         for...do...done
        
         for((初始值;限制值;执行步长))
         do
              程序段
         done
        
         非数字方面的循环进行
        
         for var in con1 con2 con3 ...
         do 
              程序段
         done
        
        
         shell脚本的追踪与调试
        
         sh [-nvx]  scripts.sh
         参数:
         -n : 不要执行脚本,仅查询语法问题
         -v :  在执行脚本前,先将脚本的内容输出到屏幕上
         -x :  将使用的脚本内容显示到屏幕上,这是很有用的参数
        
         可以通过简单的参数 -x来实现调试的目的。通常,如果执行脚本发生问题,利用-x参数,就可以知道问题在哪一行。
        
        
        
         useradd程序在建立linux上的账号时,至少会参考:
             /etc/default/useradd
             /etc/login.defs
             /ect/skel/*
         
          usermod是系统管理员root来管理账号身份的相关数据的
         
          usermod [-cdegGlsuLU]  username
         
          -c : 后面接账号的说明,即/etc/passwd的第五栏的说明栏,可以加入一些账号的说明
          -d :  后面接账号的家目录,即修改/etc/passwd的第6栏
          -s : 后面接shell的实际文件,例如/bin/bash或/bin/csh等
          -u : 后面接UID数字,即/etc/passwd第三栏的数据
          -L : 暂时将用户的密码冻结,让他无法登录。其实仅改 /etc/shadow的密码栏。
          -U : 将 /etc/shadow密码栏的!去掉,解冻。
         
          userdel
          userdel [-r]  username
          参数:
          -r : 连同用户的家目录也一起删除
         
         
          用户功能:chfn,chsh
          useradd,usermod,userdel都是系统管理员使用的命令。这两个命令是一般身份用户常用的账号数据更改命令
          1.chsh
          chsh [-ls]
          参数:
          -l : 列出当前系统上可用的shell,其实就是/etc/shells的内容
          -s : 设置修改自己的shell
          2.chfn
          chfn [-foph]
          3.finger
         
          4.id
         
          id命令可以查询某人或自己的相关UID/GID信息,它的参数也不少,使用id就可以全部列出。
         
          针对root来说,/etc/passwd还有的功能:
             passwd [-lunxwS] username
             参数:
            
             -l : 将username账号的密码锁住,在/etc/shadow内的密码栏修改
             -u  : 将-l的lock解开
             -S  : 显示当前这个username的相关信息。
            
            
          su
         
          su [-lcm] [username]
          参数:
         
          - : 如果执行 su -时,表示该用户想要变换身份成为root,且使用root的环境设置参数文件,如 /etc/.bash_profile等
          -l : 后面可以接用户,例如su -l username ,这个-l 的好处是,可使用变换身份者的所有相关环境设置文件。
          -m : -m 与 -p是一样的,表示“使用当前环境设置,而不重新读取新用户的设置文件”
          -c : 仅进行一次命令,所以-c后面可以加上命令。
         
          #变换为root是,最好使用 su -
          #建议如果要切换成某个身份,使用su - 或者是 su -l username。否则容易造成环境变量的差异。
         
          sudo
          工作原理:
          1。当用户执行sudo时,系统会主动去寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限。
          2。确认用户具有可执行sudo的权限后,便让用户“输入用户自己的密码”来确认。
          3。若密码输入成功,便开始执行sudo后续的命令。
          4。root执行sudo时,不需要输入密码。
          5。若欲切换的身份与执行者身份相同,也不需要输入密码。
         
         
          PAM模块:
          PAM(Pluggable Authentication Modules,嵌入式模块)的验证。
          PAM模块的用途非常多,除了可以在用户登录时进行身份验证之外,也可以辅助一些应用程序的验证。
         
          PAM的设置文件放在/etc/pam.d这个目录中。
          更多的环境相关设置放在/etc/security/*中。
          PAM是通过自己提供的相关模块来进行验证,模块放在/lib/security/*中。
         
          例行性命令:
         
          at : 工作仅执行一次就从Linux系统的任务分配中取消。
          cron : 工作将持续做下去。
         
          at [-m]  TIME
          参数:
          -m :  当at的工作完成后,以电子邮件的方式通知用户改工作已完成。
          TIME : 时间格式,这里可以定义出“什么时候要进行at工作”的时机
         
          ex:   at   04:00
                at   04:00  2012-12-03
                at   04pm  December 3
                at   04pm  + 3 days
                at   now + 5 minutes
                at   23:00 2012-02-16
          
           查询与删除:
           atq
          
           atrm  [jobnumber]
          
           循环执行的例行性命令cron
           用户的设置: crontab
           限制用户文件: /etc/cron.allow      /etc/cron.deny
           当用户使用crontab命令建立工作任务分配之后,该项工作就会记录到/var/spool/cron中,而且是以账号来识别的。
           举例来说,mint使用crontab后,他的工作会记录到/var/spool/cron/mint里。
          
           crontab [-u  username] [-l | -e | -r]
           参数:
           -u : 只有root才能执行这个任务,即帮其他用户建立/删除crontab
           -e : 编辑crontab的工作内容
           -l : 查看crontab的工作内容
           -r : 删除crontab的工作内容
          
          
           crontab -e 是针对用户的cron来设计的,其实是/usr/bin/crontab执行文件,而/etc/crontab是一个“纯文本文件”,可以用root的身份编辑这个文件。
           通常,cron服务的最低监测限制是“分钟”,所以“cron会每分钟去读取一次/etc/crontab 与 /var/spool/cron中的数据内容。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics