Linux 正则及基本指令详细总结

查看方式有两种:一种可以直接输入umask,就可以看到数字类型的权限设置值,
一种则是加入umask后加入-S(Symbolic)选项,就会以符号类型的方式来显示出权限了

umask的数字指的是该默认值需要减掉的权限,r、w、x分别是4、2、1

用户建立为文件默认没有可执行权限 (x),所以文件权限最大为666

用户建立为目录,x与是否进入目录有关,所以目录权限最大为777

建立文件时,文件权限就是666-022=644 即rw-r--r--

建立目录时,目录权限就是777-022=755 即rwxr-x-rx

在默认情况中,root的umask会拿掉比较多的属性,root的umask默认是022,这是基于安全的考虑,
至于一般身份用户,通常它们的umask为002,即保留同用户组的写入权限

在普通用户下:
如果我们要进入一个目录,我们需要的权限是:x(可执行权限)
对于目录来讲,如果没有r(可读)权限,我们无法查看当前目录下的文件名+文件属性
如果没有w(可写)权限,我们无法直接在该目录下创建新文件。


bash 特性:
    1, !! 执行上一条命令
    2,    !$ 获取上一条命令输入的参数
    3, $? 获取上一条命令执行结果的返回值,0表示成功呢


ls /var && echo "success"  前一个执行成功,后一条才会执行

ls /var  || echo "success"   前一个执行成功,后一条不会执行

id user &> /dev/null  && echo "exists user" || echo "not exists"  

#重定向输出不管命令执行结果,仅仅只是把结果值输出到某个设备中去
[jerry@node1 /]$ id user &> /dev/null     
[jerry@node1 /]$ echo $?
1
[jerry@node1 /]$


基本正则表达式元字符:

字符匹配:
    .  : 匹配任意一个单字符
    [] : 匹配范围内任意一个单字符
    [^]: 匹配除范围外任意一个单字符
     [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
 
匹配次数:用于指定字符前面出现的次数
    * 前面字符出现任意次数 0 - 无穷次
        x*y
        xxxxxy
        xy  ---> x出现了1次
        xay  -----> 只匹配到了y ,x 出现了0次

      .* 表示任意字符出现任意次

    \? 表示前面这个字符出现0次或1次 ,可有可无

    \+ 表示前面这个字符至少出现一次

    \{m\} 表示前面这个字符出现m 次

        \{m,n\} 表示前面这个字符至少出现m 次 至多出现n 次
        \{0,n\} 表示前面这个字符至多出现n次,也可能时 0 次
        \{m,\} 至少出现m 次

位置锚点:
         ^ : 表示行首锚定,位于模式的最左侧
         $  : 表示行尾锚定。位于模式的最右侧
         ^PATTERN$ 用于整行定位:
       ^$ 空行
       ^[[:space:]]*$ 包含空格

         \< 或 \b: 单词锚定,位于单词最左侧
          \> 或 \b: 单次锚定。位于单次最右侧
          \<pattern\> 匹配整个单词


分组:
    \(\) :  \(xy\)\{1,3\} 让 xy 这个组合串一起出现 至少出现1次最多三次


后向引用: 
    引用前面分组模式所匹配的字符串,而非模式本身

    NOTE : 分组括号中的模式匹配到的内容会被规则引擎所记录到变量中去,用 \1 \2 \3 \4 ……
    \1 从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符串
        \(ab\+\(xy\)*\)
            \1:  ab\+\(xy\)*\
            \2:   xy    

 
举例:
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\).*\1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/bash
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\)\1' /etc/passwd
[jerry@node1 /]$ grep '\([[:alpha:]]\{1,3\}t\)\1' /etc/passwd
[jerry@node1 /]$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  swapfile  sys  tmp  usr  vagrant  var
[jerry@node1 /]$ cd ~
[jerry@node1 ~]$ ls
a.txt
[jerry@node1 ~]$ vim a.txt
[jerry@node1 ~]$ grep '\([[:alpha:]]\{1,3\}t\)\1' a.txt
vtvt


                                
BASH 快捷键:

CTRL+ l 清除屏幕
ctrl + a 跳转到命令头部
ctrl+ e 跳转命令尾部

ctrl + u 删除命令光标前的字符串
ctrl + k 删除光标后面的字符串


练习:
1,查找/proc/meminfo ,以行首s字符开头,忽略大小写;至少两种写法
grep -i  '^s'  /proc/meminfo
grep '^[Ss]'  /proc/meminfo

2, 查找 /etc/passwd 不以 /bin/bash 结尾的行
grep  -v  '/bin/bash$'  /etc/passwd

3, 查找以 /etc/passwd  id 最大的用户,输出用户名
sort -t: -k3 -n /etc/passwd | tail -1f  | cut -d: -f1

4,如果root存在,显示其默认的shell程序
id root &> /dev/null && grep '^root\>' /etc/passwd | cut -d: -f7

5,找出 /etc/passwd 两位或三位数
grep -o '\<[0-9]\{2,3\}\>' /etc/passwd

6, 找出 /etc/grub.cfg 以空白字符开头,后面伴随非空白字符的行
grep '^[[:space:]]\+[^[:space:]]'  /etc/grub.cfg

7, 通过 netstat -tan 查找 LISTEN 后出现一个或多个空白字符的行
netstat -tan | grep 'LISTEN[[:space:]]*$'

8, 添加用户bash ,basher,testbash ,nologin(其shell为 /sbin/nologin) ,找到/etc/passwd 中与用户名相同的shell名
useradd bash 
useradd basher
useradd testbash
useradd -s /sbin/nologin nologin
查找用户名
 grep '^[[:alnum:]]\+\>' /etc/passwd

以第一个用户名作为后向引用结尾的参数
 grep '\(^[[:alnum:]]\+\>\).*\1$' /etc/passwd
    

9,查看root是否登录,若登录显示在线,否则显示未登录
[root@node1 ~]# w
 07:34:46 up 1 day,  2:04,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
vagrant  pts/0    10.0.2.2         05:04    6.00s  0.08s  0.12s sshd: vagrant [priv]
[root@node1 ~]# w | grep '^root\>'
[root@node1 ~]# echo $?
1
[root@node1 ~]# w | grep '^vagrant\>'
vagrant  pts/0    10.0.2.2         05:04    7.00s  0.09s  0.12s sshd: vagrant [priv]
[root@node1 ~]# echo $?
0

w | grep '^root\>' &> /dev/null && echo "logged" || echo "not login"


egrep 正则扩展的表达式:
字符匹配:
    .  : 匹配任意一个单字符
    [] : 匹配范围内任意一个单字符
    [^]: 匹配除范围外任意一个单字符
     [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
 
匹配次数:用于指定字符前面出现的次数
    * 前面字符出现任意次数 0 - 无穷次
        x*y
        xxxxxy
        xy  ---> x出现了1次
        xay  -----> 只匹配到了y ,x 出现了0次

      .* 表示任意字符出现任意次

    ? 表示前面这个字符出现0次或1次 ,可有可无

    + 表示前面这个字符至少出现一次

    {m} 表示前面这个字符出现m 次

        {m,n} 表示前面这个字符至少出现m 次 至多出现n 次
        {0,n} 表示前面这个字符至多出现n次,也可能时 0 次
        {m,} 至少出现m 次

位置锚点:
         ^ : 表示行首锚定,位于模式的最左侧
         $  : 表示行尾锚定。位于模式的最右侧
         ^PATTERN$ 用于整行定位:
       ^$ 空行
       ^[[:space:]]*$ 包含空格

         \< 或 \b: 单词锚定,位于单词最左侧
          \> 或 \b: 单次锚定。位于单次最右侧
          \<pattern\> 匹配整个单词


分组:
    () :  (xy){1,3} 让 xy 这个组合串一起出现 至少出现1次最多三次

后向引用: 引用前面分组模式所匹配的字符串,而非模式本身 ,后向引用的参数: \1 \2 \3

或关系: (ab|[:digit:]) 表式出现ab 或 数字 

练习:
1,显示当前用户root ,centos ,user1 的用户id和shell
 grep -E '^(root|jerry|tom)\>' /etc/passwd | cut -d: -f1,3,7

2,找出/etc/rc.d/init.d/functions 文件中某个单词后面跟一个小括号的行
grep -E '^[_[:alpha:]]*\(\)$'  /etc/rc.d/init.d/functions
grep -E '^[_[:alpha:]]+\(\)$'  /etc/rc.d/init.d/functions

3,使用echo 输出一段绝对路径,使用egrep取出其基名basename
#空词
echo "/etc/networks" | grep -E '\<\>'
#匹配词,除/的一个单字符
[root@node1 ~]# echo "/etc/networks" | grep -E '[^/]\>'
/etc/networks
[root@node1 ~]#

echo "/etc/networks" | grep -E '[^/]+\>'


本地变量:对当前shell有效,其余均无效
环境变量:当前shell环境中定义的变量,对本shell及其子shell有效,其余均无效
位置变量:输入命令传递的变量
局部变量:代码块变量
特殊变量: $? $0 $*  $@ $#


本地变量:
    变量赋值: name='value'  ### 注意这里的变量要紧挨着
        可以使用引用:
            value:
                 (1)可以是直接字符串; name="username"
                   (2)  变量引用: name="$username"
                   (3)  命令引用: name=`COMMAND` , name = $(COMMAND)
    变量引用: ${name}, $name 后面这种情况,如果变量未被其它影响可以不用{}
        "" : 弱引用,其中的变量引用会被替代为变量值
        "" : 强引用,其中的变量引用不会替换为变量值,而保持原字符串

pstree 可以产看当前的有哪些进程在跑

显示已定义的变量
  set
销毁变量:
unset name


环境变量:
   查看: export,   env,   printenv

设定环境变量: declare -x  num=3  ,  export name=value


只读变量:
    readonly name 
    declare -r name


位置变量:

    $0 : 命令本身
      $1 $2 $3 ...... 对应命令第一,第二参数

    $* 传递脚本所有参数,但为总一个字符串
    $@ 传递脚本所有参数,分为多个
    $# 总参数个数
    shift [n] t剔除n个参数


配置文件:
    交互式登录:
       /etc/profile  -> /etc/profile.d/*.sh  --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

   非交互式:
      ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh


bash中的算术表达式:赋值符号一定紧挨着
(1)let var=算术表达式
(2)var=$[算术表达式]
(3)var=$((算术表达式))
(4)var=$(expr arg1 arg2 arg3 ......)   //这种方式 * 要加转移符
          value=$( expr 1 \* 4 )


条件判断测试:里面判断值前后一定要有空格

  test expression
  [ expression ]
  [[ expression ]]

数值测试:
 -gt
 -ge
 -eq
 -ne
 -lt
 -le

字符串测试:
 ==
  >
 <
 !=
 =~ : 左侧字符串是否能够被右侧pattern所匹配
 注意: [[ "$name" =~ ^O.* ]]  模式这边不能加单引号,需要 [[  ]]
-z "string" 是否为空串
-n "string" 不为空串
   [ -n "$name" ]


vim 编辑器命令:
    +n : 打开后指定到多少行
    + pattern : 匹配到某个字符第一个所在的位置

vim +  /etc/passwd 光标停留在在最后一行

模式转换:
   编辑模式 --》输入模式
        i: 在光标前插入
    a: 在光标后插入
    o: 在光标所在行下新建一个行

    I: 当前光标所在行的行首插入
    A: 当前光标所在行的行尾插入
    O:当前行所在行的上方打开一个新行

    c: 
    C:  

  输入模式 --> 编辑模式
       ESC
   
  输入模式 --> 末行模式
         :

关闭文件:
    q
    wq
    x 保存退出
    w /path
    ZZ 编辑模式下输入,保存退出


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

     一次跳过指定个数的字符: 10k   10l   10j   10h

单词间进行跳转:
    w b  e
     w:下个单词词首
     e: 当前或下一个单词的词尾
     b: 当前或前一个单词的词首
     

     一次跳转指定多少个单词数: 10b  10w 10e   

行首行尾跳转:
   ^: 跳转至行尾的第一个非空白字符
   0:跳转到行首 
   $:  跳转到行尾
   
行间移动:
   #G: 跳转至指定的行
     G:最后一行
    1G 、gg : 表示回到第一行


句间移动:
     )
    ( 

段落间移动:
    } 下一个段落
    { 上一个段落


vim的编辑命令: 命令模式

字符编辑:
    x: 删除光标处的字符
    #x: 删除指定个数字符

   xp: 交换光标所处字符及其后面字符的位置

替换命令: r replace
     r : 修改单个字符的命令
     ra : 把当前光标所指定的字符修改为a
     3rm : 把光标后指定的多个字符一键替换为m

删除命令:
    d: 删除命令,可结合光标,实现范围删除
     d$:
     d0:
     d^:

     dw:
     db:
     de:

     d):
     d}:

    dd: 删除光标所在行, #dd 删除多行


粘贴命令:p put paste

p: 缓冲区存的是整行,粘贴为当前光标所在行的下方行,否在在当前光标的后面

P:缓冲区存的是整行,粘贴为当前光标所在行的上方行,否在在当前光标的后面
 

复制命令(y , yank)

y: 复制命令,工作行为相似于d命令
  
  y$: 复制到行尾
  y0: 复制到行首
  y^: 复制到行尾的第一个空白字符


  yw: 复制光标至下个单词词首前
  ye: 
  yb:

  #y 指定复制多行
  yy 复制一行
   #yy 复制多行


改变命令: c change
   会改变模式 编辑---》输入
  
    c$
    c^
    c0

    cb
    ce
    cw

    cc: 删除并输入新内容 ,删除单行修改
    #cc   : 指定删除多行,并修改

 
可视化命令:

    v: 按字符选定
    V:按行选定

   常结合编辑命令使用:
       d  c  y 

撤回命令:u undo
    
     #u: 撤回指定n次
     
撤销此前的撤销:restore
    Ctrl + r 


重复前一个编辑命令操作:点号
    .

翻盘操作:

Ctrl + f: 向文件尾部翻一屏
Ctrl + b:向文件首部翻一屏

Ctrl + d:向文件尾部翻半屏
Ctrl + u: 向文件首部翻半屏


vim 自带的教程: vimtutor


vim 的末行模式: 内建命令行的接口

地址定界:start_p, end_p
:2,200  从2到100行
:2,+4  从二开始,往后移动多加4行例如: 1,+3d 从第一行开始,后面三行删除
 :  . 表示当前行
 :$ 最后一行
       . , $-1 当前到倒数第一行

 :% 全文,相当于 1,$


 /PATTERN1/ ,  /PATTERN2/
   从左侧第一次匹配的模式,到第二个模式第一次匹配

#, /pat/   从几到匹配的模式第一个字符串
/pat/, $     模式匹配到最后行尾

使用方式:
    通过地址定界直接跟命令

:1,20w /path/another.txt   指定范围内的内容存在新的文件

:r  /path/file  把指定文件插入到当前所指定的光标下

查找功能:
 /PATTERN : 从当前光标所在处向文件尾部查找
?PATTERN :  从当前光标所在处向文件首部查找

n: 与命令同方向
N: 与命令反方向


查找并替换:
s:在末行模式下完成查找并替换
 
    s/要查找的内容/替换的内容/修饰符
       要查找的内容:可以使用模式,基本正则表达式
       替换的内容: 不能使用模式,可以使用\1,\2 ..... .可以用“&”引用前面查找内容  
       修饰符: i 忽略大小写, g 全局替换,否则一行只会替换第一次出现的


:. , $s/r\(..\)t/R\1T/g     查找以r开头 t 结尾的字符并替换 为 R, T,中间的字符不变


:%s/l..x/&er/g    找到的字符补上er

: 1,10s/how/HOW  替换找到的第一个字符

不用转义的符号:使用其它的符号来替换分割符号

:%s@@/etc/fstab@@/var/log@@g

: %s/^[[:space:]]\+//g  以空格开始的行替换为空

%s/^[[:space:]]/#&/   每一行以空格开始的行,把它替换成# 


花括号{1,2,3}命令展开模式
vim  etc/{1.txt,2.txt,3.txt}

在多个文件来回切换:

复制,粘贴,删除功能
:next 下一个文件
:prev 上一个文件
:first 第一个文件
:last  最后一个文件

:wall 保存所有
:qall 退出所有


窗口分割模式:

 vim -o|-O file1 file2 file3
      -o 水平分割
      -O 垂直分割

窗口间切换: Ctrl + w ,左右键切换 or 上下键


当文件窗口切割: Ctrl + w , s 水平分割    Ctrl+w,v 垂直分割


定制vim 工作特性:
  配置文件:
     全局: /etc/vimrc
     个人: ~/.vimrc

 末行: 当前vim 进程有效

 (1)行号
      :set nu   显示
      :   set nonu 取消
   (2) 括号匹配
     :set sm  显示匹配
     :set nosm 取消括号显示匹配

  (3)自动缩进
      :set ai   
       :   set noai  

    (4) 高亮搜索
      :set hlsearch
      :   set nohlsearch

   (5): 语法高亮:
      : syntax on
      : syntax off

  (6): 忽略字符大小写
     : set ic
      :   set noic

文件测试命令:

存在性测试:
  -a file
  -e file  存在为真,否则为假

文件类型测试:
    -b file 块文件
    -c  file 字符设备文件
    -d  file  目录文件
    -f  file  普通文件
    -h | -L 链接文件
    -p file 管道文件
    -S file 套接字文件
    -r  可读
    -w 可写
    -x 可执行
    -s 文件大小
    -t 描述文件句柄fd是否打开,且与某个终端相连接

文件特殊权限测试:
     -g file  sgid 权限
     -u file  suid 权限
     -k sticky 权限


-N file : 文件自从上被读取后是否被修改
-O file : 当前用户是否为主
-G file: 当前用户是否为组


******双目测试********:
 file1 -ef file2   file1与file2 是否指向同一个设备上相同的inode

 file1 -nt  file2  file1 是否新于file2
 file1 -ot  file2  ..................旧于 

组合测试条件
   逻辑运算
      第一种方式:
             command1 && command2
             command1 ||  command2
             ! command
             [-e file ] && [ -r file ]

     第二种方式:
             expression1 -a  expression2
             expression1  -o expression2
             ! expression1  

[ -z "$hostName" -o  "$hostName"=="localhostdomain" ]  && hostname www.baidu.com

##查看文件类型,加引号是字符串
[ -f /bin/cat   -a   -x /bin/cat ] &&  cat /etc/fstab

判断文件既不可读也不可写

[ !  \(  -r /tmp/ff.txt  -o  -w /tmp/ff.txt   \)  ] 非的条件表达式,需要用()框起来,否则条件不成立 [  ! -r /tmp/ff.txt  -a   ! -w /tmp/ff.txt ]


查找命令:
   locate keyword  通过关键字离线查找
   find /file/path   

find [optinon] [查找路径] [查找条件] [处理动作]

默认不给路径,默认当前目录机型查找。一般就是所有的文件都会显示 

查找条件:
 -name "文件名称" 支持golob   *,? , [],[^]
 -iname "文件名" ,不区分大小写
 -regex  "pattern" : 以pattern 去匹配整个文件路径的字符串,不仅仅是文件名称
根据属主,属组查找:
  -user 用户名  : 属主
  -group 组名: 属组
  -uid  uid : 通过uid 查找
  -gid   gid : 通过gid 查找
  -nouser /nogroup 无主或组的文件  

find /home -user vagrant  -ls

find /tmp -group vagrant  -ls

根据文件类型查找:
  -type TYPE:
    f d l s b c p

find /tmp -type  s  -ls
       
组合条件:
   与: -a
   或: -o
   非: -not , !

find /  \( -nouser  -o  -nogroup \)  -ls   查找无主或者无组的文件,ls 对这两个条件做列表,否则只显示靠近的哪一个条件显示


查找不是fstab 并且属主不为root 的文件

find  /    \( -not -name "fstab" -a  -not -user root \)  -ls

find  /    -not  \(  -name "fstab" -o  -user root  \)  -ls


根据文件大小查找:
   -size [+|-]unit
       k ,g ,

find /var -size 3k -exec ls -lh {} \;

不是用+- 符号,则为(3-1,3】这样一个范围的文件
-#unit 范围: 【0, #-1】
+#unit 范围: 【#, +无穷】

根据时间戳来查找:
   天
   -atime   [+|-]#
      #: [#,#+1)
      +#: [#+1,无穷大]
      -#: [0, #)

  touch  -a  -t 202303050707.00 aa.txt 修改文件访问时间

   -mtime
   -ctime
   分钟
   -amin
    -mmin
    -cmin


根据权限查找:
   -perm [+|-]MODE
        MODE:  600  权限精确匹配
        +MODE: 任何一类(u,g, o)对象中,只要有一位匹配即可,0 不做考虑
  find / -perm +001  -ls  查找其它用户有执行权限的文件
        -MODE:每一类对象都必须同时拥有为其指定的权限
            -666  ,文件的三类(u,g, o) 都要大于等于当前文件权限的数字

  centos7 中+MODE 废除,用/MODE 表示


处理动作:

-print 默认显示到控制台
-ls 列表展示
-ok  COMMAND {}\;    每个文件都会执行该命令,每个都需要确认
    {} 用于引用查找到的文件名自身

-ok mv {} {}.new \;   修改文件名,原来的名以.new 为后缀

-exec  COMMAND {}\;  对查找的到每一个文件都会执行该命令

参数过长,采用 find | xargs  COMMAND 命令进行


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值