Grep和正则表达式

  • Grep命令:
    • 使用基本的正则表达式定义的模式来过滤文本的命令.
    • 用于文件的检所,需要 Global Research 根据模式进行文本行(有部分匹配就可以)搜素,并将符合模式的文本行显示出来. 模式:pattern:有文本字符和正则表达式的元
      字符组合而成的匹配条件;
    • -i:表示忽略字符大小写;
    • --color:使用高亮颜色进行显示.可以通过这个定义别名机制 alias grep=‘ grep --color’;
    • -v:进行反向查找, 未匹配的行进行显示;
    • -o:只显示被模式匹配的字符串;
    • -E:使用扩展的正则表达式;
    • -A #:显示匹配到的以及下几行;
    • -B #:表示前面的几行;
    • -C #:表示上下几行;
    • -n:表示显示匹配到的行号;
    • -f:表示模式按照文件里面的行进行匹配;
    • -x:表示按照行进行匹配;
    • -c:表示用于统计出现的次数;
    • -w:默认是进行行匹配的,通过-w表示进行word的匹配;
  • 正则表达式:
    • 原则之一:尽可能长的进行文件的匹配;
    • 元字符:
      • .:匹配任意单个字符;
      • *:表示匹配前面的字符任意次;
      • .*:表示任意长度的任意字符;
      • ?: 匹配前面的字符一次或者0次,在使用时,需要使用\?进行转义;
      • \{m,n\}:表示匹配前面的字符至少m次,最多n次,这里需要使用{}进行转义,否则会被bash解释,而不是交给grep解释;
      • []:表示匹配指定范围内的单个字符;
      • [^]:表示匹配指定范围之外的单个字符;
    • 字符集和:
      • [:digit:] :表示数字;
      • [:lower:]:表示小写字母;
      • [:upper:]:表示大写字母;
      • [:space:]:表示空白字符;
      • [:alpha:]:表示字母;
      • [:alnum:]:表示字母和数字的组合;
  • 位置铆定:
    • ^:之后的模式必须出现在行首;
    • $:此字符前面的内容必须出现在行尾;
    • ^$:表示空白行;
    • \< :其后面的任意字符必须作为单词的首部出现;
    • \>:其前面的字符必须作为单词的尾部出现.也可以使用\b 进行替换, 写在前面或者后面;
  • 分组
  • \(\):()里面的内容作为一个整体出现,例如:\(ab\)*:表示ab是一个整体,可以出现任意次;
  • 后向引用:
    • \1:引用第一个左括号以及与之对应的的右括号所包括的所有内容
    • \num:\1:引用第num个左括号以及与之对应的的右括号所包括的所有内容,使其作为一个整体出现;
      这里写图片描述
  • 扩展的正则表达式
  • 字符匹配的含义和上面是相同的;
  • 次数匹配+:表示匹配其前面的字符至少一次;
  • {m,n}:是不需要进行转义的;
  • 位置铆钉字符的含义都是相同的;
  • 分组的含义也是相同的;
  • |:表示的是or的含义;
  • Grep -E:表示使用的是扩展的正则表达式;
  • fgrep:表示用于进行快速搜索,不支持正则表达式;
  • shell编程的基础知识
  • 编程语言:机器语言,汇编语言,高级语言:静态语言:编译型语言,强类型的语言(变
    量);
  • 关键字:被转换成机器可执行的控制指令.在执行之前就需要进行转换. C 语言,
    C++、JAVA、C#;
  • 动态语言:一边解释,一边执行.PHPSHELLpythonperl,需要解释器,解释器由静态语言开发. Lua 语言 python 语言.
    面向对象:用于开发大型应用程序. JAVA python C++ perl;
    面向过程:着眼于问题的结局本身;
  • shell抑或:操作数相同为假,不同则为真. shell 是弱类型编程语言. 不需要声明,甚至不需要区分类型.;
  • 强类型语言:变量在使用前一定要声明,甚至初始化,
  • bash 的变量类型:
    • 环境变量:在bash 里面声明的变量,只能在该变量的进程环境中使用,不同 shell中的变量不能传递使用; 引用变量${变量名} {}通常可以省略,例如:There are some ${变量},如果使用的是双引号,就会替换${变量},如果使用的是单引号,就不会进行替换;作用域为当前 shell 进程及其子进程,export varname=value
      或者: varname=value ,export varname,作用域为当前 shell以及其子 shell;
      这里写图片描述
    • 本地变量(局部变量):本地变量使用 VARNANE=VALUE 进行初始化 局部变量:使用 local 变量名=VALUE指定当前代码段有效,作用域为当前 shell;
    • 位置变量: $1,$2,$3.......,脚本的第一个、第二个、第三个参数等等,通常来说脚本在执行时,可以传递参数,通过上面的方式来引用各个不同的参数;
    • 特殊变量:(系统变量):
      • $?:保存上一个命令执行状态返回值;程序执行是有两类返回值:一类是执行结果,另一类是执行状态返回代码(0-255);0 表示正确,1-255:表示错误执行. 1,2,127,系统进行预留的.
      • $# :表示参数的个数;
      • $*:参数列表;
      • $@:表示参数列表
  • 脚本在执行时会启动一个子 shell 进程.:命令行启动的脚本汇集成环境变量,系统自动执行的脚本(非命令行启动)就需要各环境变量. 撤销变量: unset varname,unset $varname 撤销变量值.可以使用 set 查看当前 shell 中的环境变量和本地变量,使用printenv, env, export 查看当前 shell 中的环境变量. 变量赋予多个值:ANIMALS=pig ANIMALS=4ANIMALS:goat,多个变量之间使用:隔开就了.shell 中的变量值都是字符串 ,不能直接进行算数运算;
  • printenv:print all or part of environment,通常是用于输出指定的环境变量,如果没有指定,就输出所有的环境变量;
  • env:用于在修改后的环境变量中运行一个程序,用于在环境变量中设置键值对,然后运行,感觉类似于宏;
  • export:多用于设置一个环境变量;
  • set查看环境变量的结果
    这里写图片描述
  • 脚本
  • 命令的堆砌,按实际需要结合命令流程控制机制实现的.脚本需要通过解释器来进行解释,#!/bin/bash其实是脚本解释器的路径,将文件的ASICII 码文件交给解释器进行分析;
    • 条件判断:通过$?得到上一个命令执行的返回值;
      • 整数测试
        • -eq:测试两个数是否相等 为真返回值是 0 否则为任意值;
        • -ne:测试两个整数不相等;
        • -gt:测试第一个数大于第二个数;
        • -lt:测试第一个数是否小于第二个数;
        • -ge:大于或者等于;
        • -le:小于或者等于;
      • 字符测试:
        • 字符测试的格式:[ expression ],或者[[expression ]]或者test expression;
      • 逻辑关系:
        • &&:第一个条件为假时,第二个不进行判断 ,最终结果为假,第一个条件为真时,第二个条件一定会判断;例如id user1 &> /dev/null && echo “hello ,word!”;
        • ||:前面为真,后面不执行,前面为假,后面执行;! id user 6 && useradd user6或者id user6 || useradd user6;
          • 如果用户不存在就添加,并且 给 密 码 , 否 则 就 显 示 已 经 存 在,! id username && useradd username && echo “username” | passwd –stdin username || echo “username exxists.”;
  • 判断语句: 单分支 if 结构:
if 判断条件 ; then 
		 statement1 statement2
		statement3
fi
  • 双 分支 if 结 构:
if 判 断条 件; then 
	statement1 
	statement2
	statement4 
else 
	statement1 
	statement2 
fi
  • Linux 中:0为真,其他都为假. 脚本执行需要退出时使用 exit 命令结束进程;
    • shell中的运算符号:
      • 算术运算表达式 : let c=$A+$B;
      • 算术表达式: C=$[$A+$B];
      • expr 算术表达式:表达式中各操作数,以及运算符之间要有空格,而且要使用命令引用:‘C=expr $A + $B’;
  • 文件测试:
    • -e:测试文件是否存在;
    • -f:测试文件是否是普通文件;
    • -d:测试指定文件是否是目录的;
    • -r:测试目标文件对当前用户是否可读;
    • -w:测试目标文件对当前用户是否有 写的权限;
    • -x:测试目录文件是否对当前用户有执行的权限;
  • 测试格式如上上所述 使用bash –n脚本 filename 查看脚本是否有错误;bash –x分布执行脚本,有利于发现脚本中的错误. 如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即作为脚本的推出状态码;
  • sed:
    • 数据流编辑器,sed: Stream Editor 行文本编辑器,进行逐行读取,再内存中按照模式进行编辑,这段内存空间称为 sed 模式空间,处理的是从源文件读取到内存中的副本进行处理,在返回输出到屏幕,处理结束后,默处理运作:默认为显示认将模式空间中的内容显示出来,默认是不会编辑源文件的
    • 选项:
      • -n:表示静默显示,不将模式空间中的文本进行显示;
      • -i:直接修改源文件
      • -e SCRIPT -e SCRIPT2:可以同时执行多个脚本;
      • -f /PATH/TO/SED_SCRIPT:例如sed –f /path/to/sed_script file;
      • -r:使用扩展正则表达式;
    • sed使用格式: sed [options] ‘Address Command’ file ........ :
      • Address 表示方法:
        • 1、Startline, Endline 比如: 1, 100; $;表示最后一行,可以有$-1 这种用法;
        • 2、 /PegExp/: 要使用正则表达式 例如: /^root/
        • 3、/pattern1/,/pattern2/: 表示第一次被 pattern1 匹配到的行开始到第一次被pattern2 匹配的行结束,这中间所有的行;
        • 4、LineNumber 表示指定的行;
        • 5、StartLine, +N ;表示从指定的 StartLine 开始,向后的 N 行;
  • COMMAND:
    • d:删除符合条件的行;
      • sed ‘1,2d’ /filename:删除1,2行;
      • sed ‘3.$d’ /filename:删除第三行到最后一行;
      • sed ‘1,+2’ /filename:表示删除向后的几行;
      • sed ‘/oot/d’/filename:删除包含oot的行;
      • sed ‘/^\//d’ /filename:删除以/开头的行;
      • sed '/^$/d' test.txt:删除空白行;
    • p:显示符合条件的行: sed -n ‘/^\//p’ /filename:显示\开头的行,否则符合条件的会显示两遍;
    • a \string: 在 指 定 的 行 后 面 追 加 新 行 内 容 为 string;sed ‘/^\//a\# hello word’/filename 在以/开头的文件后面追加 # hello word 一行;
    • i \string :在指定的行前面添加新行,内容为 string,用法与 a相同;
    • r /filename:表示将指定文件的内容添加到符合条件的行处; sed ‘2r /filename‘ /filename1 表示将文件 1 中的内容添加到 filename 中的第 2 行处 sed ‘1,2r/filename ‘ /filename1 添加到 1, 2 行后面 sed ‘$r /filename ‘ /filename1 添加到最后一行;
    • w file : 将地址指定范围内的内容,另存至指定的文件中;sed ‘ /oot/w /filename ‘ /filename;
  • 查找并且替换:s/pattern/string/修饰符 :查找并且替换 默认只替换每一行中第一次被模式配得到的字符串 sed ‘s/oot/OOT/ ‘ /filename sed ‘s/^\///#/’ /filrname;
    • 修饰符号:
      • g:全局替换;
      • i:查找是忽略字符大小写;
      • s///:后面的///可以统一替换为###等三个一样的符号,避免使用字符转义,例如:sed‘s@/@#@g’ /filename;这里可以使用后向引用;
        • sed ‘s#\(1..e\)#&\1r#g ‘ /filename;
      • &:表示模式匹配到整个字符串;有时候是只能够使用后向引用的sed ‘s#l\(..e\)#L\1#g’ /filename;
      • history | sed 's#^[[:space:]]*##g' | cut -d ' ' -f1;
      • 删除全文的空白字符:history | sed ‘ s#[[:space:]]##g’;
      • 删除行首的空白字符:history | sed ‘s#^[[:space:]]+##g’ | cut –d ‘ ‘ –f1;
  • 字符串测试:
    • ==:用来比较两个字符串是否相等,相等为真,不等为假;例如[[ “$变量名” == “$变量名” ]], [ $变量名 = $变量名 ]
    • !=:用法如上,不等于测试,不等为真,相等为假,同样用法的包括>: < >= <= ;
    • -n /string:测试指定的字符串是否为空, 空则为真,不空则为假;
    • -s /string:测定指定的字符串是否不为空,不空为真,空则为假;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值