一 vim
 vi visual interface 全屏文本编辑器
 行文本编辑器sed
 全屏:vi/vim  nano
 vim = vi improved
 
 模式:
  编辑模式,命令模式
  输入模式
  末行模式
 编辑模式--》输入模式
  i   insert,原地插入
  a append,之后插入
  o 新起一行插入
  I 行首插入
  A 行尾插入
  O 当前行上方插入新行
 输入模式--》编辑模式
  按ESC键
 编辑模式--》末行模式
  按  :wq 保存退出
 末行模式--》编辑模式
  按ESC键,连按两次
 
 vim  打开文件如果存在直接编辑,如果不存在会创建文件,路径必须正常
 vim +n  file 打开文件并路到第n行
  +/PATTERN
 :q
 :q!
 :wq  强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
 :x  写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。

 编辑模式下按ZZ会保存

 光标跳转
  字符间跳转
  h   j    k    l
  左 下 上   右

   每个跳转字符前面可以加数字,表示多个字符跳转
  3h 向左跳3个字符
  
  单词间跳转
  w  跳到后一个单词的词首   符号被当作单独单词,_不当作单独单词
  e  当前或后一单词的词尾
  b  当前或前一单词的词首
  前面加数字 ,可以多词跳转
  
  行内跳转
  ^ 跳转至行首的第一个非空白字符
  0 跳转到行首
  $ 跳转到行毛
 
  行间移动
  #G  跳转到第#号
  1G gg 跳转到第一行
  G  跳转到最后一行
 
  句间移动
  ) 跳到下一句  以各种符号分隔
  ( 跳到上一句
 
  段落间移动
  }  跳到下一段  以整行空白 分隔
  {  跳到上一段  以整行空白 分隔
  
  编辑命令
  
   字符编辑
    x 删除光标所在处的字符
    #x 删除光标所在处入之后的#个字符
    xp 把光标所在外的字符和后面的字符对掉
    r 替换所在处的字符
    #r
  删除命令
  d 删除,可以跟光标跳转一起使用
  d$ 删除光标位置 到行尾的字符
  d^ 删除光标位置 到行首的字符
  d0 删除光标位置 到行首的字符
  
  dw  删除光标到下一词前的的全部字符(同时删除下一词前的符号)
  de  删除光标到词尾的全部字符(不删除下一词前的符号)
  db 删除光标到词首的全部字符,如果已经在词首,删除光标之前的整个词
  
  dd  删除光标所在一整行
  #dd 删除光标所在行及后面的#行
 所有删除内容被VIM编辑器保存至缓冲区
  
  粘贴命令
  如果此前复制或删除内容不是一个完整行
  p 粘贴到光标所在位置的后方
  P 粘贴到光标所在位置的前方
  如果此前复制或删除内容是完整行或多行
  p 粘贴到光标所在行的下方
  P  粘贴到光标所在行的上方
 
  复制命令
  y 复币
  y$  复制光标位置 到行尾的字符
  y^  复制光标位置 到行首的字符
  y0 复制光标位置 到行首的字符
  ‘=
  yw 复制光标到下一词前的全部字符
  ye  复制光标到词尾的全部字符
  yb 复制光标到词首的全部字符,如果已经在词首,复制光标之前的整个词
  
  yy  复制整行
  #y 复制#行
  
  改变命令 
  c   删除--->剪切---->进入插入模式
  c$  c^  c0
  ce  cw  cb
  cc
  #c
 
  撤销命令
  u
  #u
  
  恢复撤消
  ctrl+r
  .  重复前一个操作命令
  
  翻屏操作
  ctrl+f 向后翻一屏
  ctrl+b 向前翻一屏
  ctrl+d 向后半屏
  ctrl+u 向前半屏
  
  vimtutor  vim内置教程
 
  末行模式
  地址,定界  后面都可以跟编辑命令 d  y  w  r
   :start,end
    #第#行
   :5             光标跳到第5行
   :100         光标跳到第100行
   :100d       删除第100行
   
   #,# 第#行到第#行
   #,+#
   :100,+3d          第100行后面的3行内容删除
    . 当前行
    $ 最后一行
    :.,$-1d
   %   1,$ 全文


   :/part1/ 第一次被此模式所匹配的行
   :/umask/
   :#,/umask/
   :/part1/,/part2/
   
  查找功能
  /PATTERN 从光标向尾部查找
  ?PATTERN 从光标向头部查找
   n 与命令同方向查找下一个
   N 与命令反方向查找下一个
  
  查找替换
  s 在末行模式下 在地址定界范围内完成查找替换操作
  s/要查找的内容/替换为的内容/修饰符
  查找的内容:可使用模式
  替换的肉容:不能使用模式,可以使用后面引用符号
  &引用要查找的内容匹配到的整个内容
  修饰符
   i 忽略大小写
   g 全局替换
   
  /:用于分隔符,要使用\对符号进行转义
   
  :3,100s/pid/processid/g
  :%s@/etc/fstab@/tmp/fstab@/g
  :.,+20s/^# //g
 
 
  多文件模式
  vim  file1 file2
  :next     切换到下一个文件
  :first      切换到第一个文件
  :last       切换到最后一个文件
  :prev     切换到前一个文件
  :wqall     保存全部文件
  :q!all       不保存全部文件 并退出
  
  多文件窗口分割
  vim -o file1 file2    水平分割
   -O     垂直分割
   ctrl+w+箭头
  单文件窗口分割
   ctrl+w+s    水平分割 按ctrl+w +方向切换窗口
   ctrl+w+v 垂直分割 按ctrl+w +方向切换窗口
 
  定制 vim
  显示行号   :set nu
  不显示行号 :set nonu
  括号匹配 set sm
     set  no sm
  自动缩进 set ai
     set noai
  高亮搜索 set hlsearch
     set nohlserch
  语法着色 syntax on
     syntax off
  忽略字符大小写 set ic
      set noic
  :help
  vim 中文手册
  vim /etc/vimrc  vim的全局配置文件
   /~/.vimrc   vim的个人配置文件

 

二 文件查找

locate  文件查找,根据索引查找,新文件可能找不到 ,查找速度快 ,模糊查找
                 索引的构建是在系统空闲时自动进行(周期性任务) ,手动更新数据库(updatedb)

 

find   文件找查,实时查找,查找速度慢,精确查找
  find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
  find [OPTION]...  [查找路径] [查找条件] [处理动作]
  查找路径 默认为当前路径
  查找条件 指定查找标准,可以根据文件名,大小,属主,类型等,默认指出指定路径下的所有文件
  处理动作 对符合条件的文件做什么操作,默认输出到屏幕

  查找条件
   根据文件名进行查找
    -name 文件名   支持使用glob
     * ? []
    -iname 文件名   不区分大小写,支持使用glob
    -regex "PATTERN"  以PATTERN匹配整个文件路径字符串,不公公是文件名

   find /tme -user centos 
   find /tmp -user centos -ls
   find /tmp -group centos -ls

  根据属主,属组查找
  -user username
  -group groupname
  -uid useruid
  -gid usergid
  -nouser 没有属主的文件
  -nogroup 没有属组的文件
  
  根所文件类型查找
  -type  TYPE
   f 普通文件
   d 目录文件
   l 符号连接文件 
   b 块设备 
   c 字符设备文件
   p 命令管道 
   s 套接字文件
  find /tmp -type s -ls
  
  组合查找条件
   非条件 -not,!
   与条件 -a
   或条件 -o

  find -type f -a -nouser -ls 
  find /tmp \( -nouser -o -user marion \) -ls
  find /etc ! -name "*.conf"

  !A -o !B  = !(A -a B)
  !A -a !B  = !(A -o B)

 find /etc -not -name "a.conf" -a -not -type f  -ls 
  find /etc -not \( -name "a.conf" -o -not -type f ) -ls

  根据文件大小查找
  -size [+|-] #UNIT
  单位 k M G
   #UNIT  (+-1,#]
   +UNIT  (#,+OO)
   -UNIT  [0,#-1]
  find /etc -size -3k
  
  以时间查找
  以天为单位
    -atime    [+|-]n                   accessed  n*24  hours  ago   

    -mtime   [+|-]n                   modified n*24 hours ago

   -ctime      [+|-]n                   changed n*24 hours ago                  

find /etc -mtime -3 -ls

  以分钟为单位
   -amin    [+|-]n                     accessed  n minutes ago

   -mmim  [+|-]n                    modified n minutes ago

   -cmin     [+|-]n                    changed n minutes ago

   
  根据权限
   -perm [/|-] MODE
   MODE 精确权限匹配
   /MODE 任何一类对像(u,g,o) 的任何一位权限符合即可,隐含或条件,三类条件中的任一符合都可以
   -MODE 每一类对像(u,g,o)指定的每一位权限必须同时存大方或符合条件,隐含与条件。

  find ./ -perm /222 -ls 
  find ./ -perm -222 -ls

    处理动作
   -print :默认显示到屏幕
   -ls 
   -delete
   -fls /path/to/somefile
   
   -ok  COMMAND{} \;    对每个文件执行前要用户确认
   -exec  COMANND{} \; 对文件的执行无须用户确认

  find ./ -perm -222 -exec ls -lh {} \;
  find ./ -perm -003 -exec chmod o-w {} \;
  find ./ -not -perm /111  -ls 
  find ./ -not -perm /111 -exec mv {} {}.old \;

三  bash环境配置
man bash
 配置文件 
 全局配置文件 /etc/profile    /etc/profile.d/*.sh
                      /etc/bashrc
     
 个人配置文件 ~/.bash_profile
                      ~/.bashrc
 Profile类
         功用 定义环境变量
         运行的命令或者脚本
 bashrc类
         功用 自定义命令别名
         定义本地变量

pstree
set
env
printenv
export

unset 变量名  取消变量
$变量名    引用变量

''  强制用,变量替换不会发生
""  弱引用
``  命令引用
ls -l `which cat`
 
shell登录类型
 交互式登录
      通过终端进行的登录
      通过su -l 命令实现的用户切换
 非交互式登录
      图型界面下打开的命令行窗口
      执行脚本
  
配置文件的作用次序 后面的优先级高于前面的优先级
 交互式登录  :
  /etc/profile-->/etc/profile.d/*.sh-->~/.bash_profile --> ~/.bashrc --> /etc/bashrc
  
 非交互式登录
  ~/.bashrc--> /etc/bashrc --> /etc/profile.d/*.sh
 
 编辑的配置文件定义生效方法
 重新登录
 让当前shell进程去重新读到指定的配置文件
  source /path/to/somefile
  ./path/to/somefile
   注意:副作用,每读取一次会把配置的内容附加到环境中,造成配置重复
   

四  Linux文件系统上的特殊权限
 
 进程的安全上下文
  进程有属组(进程以哪个用户的身份运行)
  (1) 用户是否把某个可执行文件起动为进程,取决于用户对程序文件是否拥有执行权限
  (2) 程序起动为进程后,此进程的属主为当前用户, 进程所属的组,为发起者的基本组
  (3) 进程拥有的访问权限,取决其属主的访问权限
   进程的属主同文件属主,应用文件属主权限
   进程的属主属于文件的属组,应用文件属组权限
   其它情况,应用其它权限
 
 SUID 用户是否把某个可执行文件起动为进程,取决于用户对程序文件是否拥有执行权限
   任何用户来执行该程序为进程时,该程序是程序的属主发起程序
  chmod u+s /tmp/cat
 注意
  S 属主原来无x权限
  s 属主原来有x权限
 
 SGID 默认情况下,用户创建文件其属组为此用户所属的基本组
   一旦某目录设置了SGID权限,则些目录拥有写权限的用户在此目录中创建的文件的组为目录的属组,不是创建用户的基本组。  

chmod g+s /tmp/test/

  注意
  S 属组原来无x权限
  s 属组原来有x权限
  
 Sticky 对一个多个可写的目录,此权限用于限制每个用户仅能删除属主为自已的权限

  chmod o+t file 
  chmod o+t /tmp/test

   SUID SGID STICKY
     0       0         0 

chmod 4777 file

五  Linux磁盘管理 和文件系统

 识别硬盘 /dev/sd#
     标记不同的硬盘设备 /dev/sd[a-]
     标记同一设备上的不同分区  /dev/sd[a-z][1-]

        1-4: 主或扩展分区标识
        5+:逻辑分区标识 
 
 设备文件 特殊文件
    设备号
      major,minor
      major 设备类型
      minor 同一类型下的不同设备
   
 块设备   标识为b 随机访问设备
 字符设备 标记为c 线性设备
 
 GPT
 
 分区,分隔存储空间为多个小的空间,每个空间可独立使用文件系统
 
 分区工具
  fdisk        parted        sfdisk
  
 fdisk 最多支持在一块硬盘上的15个分区

 

    分区管理子命令

        p: 显示
        n: 创建
        d: 删除
        t: 修改分区ID
        l: 列出所有支持ID类型
        w: 保存退出
        q: 放弃修改并退出
        m: 获取帮助

    创建完成之后,查看内核是否已经识别新的分区:

cat /proc/partitions

有三个命令可以让内核重读磁盘分区表:
    CentOS 5:        partprobe [DEVICE]
    CentOS 6,7:     partx        kpartx

    partx命令:
     partx DEVICE
     partx -a DEVICE
     partx -a -n M:N DEVICE
      M
      M:
      :N

    kpartx命令:
     kpartx -af DEVICE

  partx -a -n 4:5 /dev/sda
  kpartx -af /dev/sda

 文件系统管理
 文件系统 VFS   Virtual File System

 Linux              :  ext2  ext3  ext4  btrfs  swap 
 Unix               :  xfs  ffs  ufs  jfs jfs2
 光盘                : ISO9660
 Win                :  fat32/vfat   ntfs
网络文件系统   :  net  nfs  cifs
集群文件系统   : ocfs2  gfs2
分布式文件系统:  ceph    moosefs   mogilefs  hdfs  gfs   glusterfs
 
 日志型文件系统      ext3

 非日志型文件系统   ext2 
 交换分区swap
 
 创建文件系统
      在分区上执行格式化(高级格式化)

      要使用某种文件系统,满足两个条件:

          内核中 支持此文件系统
          用户空间 有文件系统管理工具


      创建工具:mkfs (make filesystem)    mkfs -t type DEVICE
      mkfs.ext4
      fsck
      fsck.ext4
      ext系列文件系统的专用管理工具:mke2fs -t  ext2|ext3|ext4 DEVICE
  
      blkid /dev/sda5   显示文件系统的详细信息

 

练习

6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;

  cp /etc/grub2.cfg /tmp/
    vim /tmp/grub2.cfg
      :%s@^[[:space:]]@@g    
      :1,$s/^[[:space:]]//g    
      :%s/^[[:space:]]

7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;

  cp /etc/rc.d/init.d/functions /tmp/
    vim /tmp/functions
  :%s@^[[:space:]]@#&@g

8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;

  vim /tmp/functions
  :%s@/etc/sysconfig/init@/var/log@g

9、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;

    vim /tmp/functions
    :%s@^#\([[:space:]]\+\)@\1@g

10、查找/var目录属主为root,且属组为mail的所有文件;

find /var -user root -a -group mail -ls

11、查找/usr目录下不属于root、bin或hadoop的所有文件;

  find /usr -not \( -user root -o -user wang -o user hadoop \) -ls

12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;

find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls

  13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;

  find /etc -atime -7 -a -not \( -nouser  -o -nogroup \) -ls

  14、查找/etc目录下大于20k且类型为普通文件的所有文件;

  find /etc -size +20k -a -type f -ls

  15、查找/etc目录下所有用户都没有写权限的文件;

 find /etc -not -perm /222 -ls

  16、查找/etc目录下至少有一类用户没有执行权限的文件;

  find /etc -not -perm -111 -ls

 17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;

 find /etc/init.d -perm /111 -a -perm /002 -ls

  18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;

  cp /bin/cat /tmp

  chmod u+s /tmp/cat 

  su - hadoop

  /test/cat shadow

19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;

  mkdir -p /test/data

  chmod g+wrxs,o+wrxt /test/data

 or

  chmod 3777 data