linux三剑客

  • 正则表达式

    • 基本正则表达式( ^,s, .,[],*)元字符

      • Linux正则表达式是一种用于处理大量字符串的工具,它可以定义一套规则和方法来匹配特定的文本模式。正则表达式由普通字符(如字母a到z)以及特殊字符(也称为元字符)组成,用于描述如何在查找或替换字符串时匹配一个或多个字符串。Linux环境中的许多命令,如grep、sed、awk和find,都支持使用正则表达式来实现复杂的文本处理任务。

      • 正则表达式的基本概念包括: 字符类:可以通过字符类指定一组字符,如`[0-9]`表示数字字符,`[a-z]`表示小写英文字母。 量词:`*`表示零个或多个前缀,`+`表示一次或多次前缀,`?`表示零到一次前缀。 边界标志:`^`表示行的开始,`$`表示行的结束。 选择器:`|`用于分隔不同的选择条件。 重复量:`{n}`表示重复n次,`{n,}`表示至少重复n次,`{n,m}`表示重复n到m次。

      • 正则表达式的使用示例包括: 使用`grep`命令来匹配包含特定文本的信息。 使用`sed`命令通过正则表达式进行文本替换或删除。 使用`awk`命令结合正则表达式执行各种数据处理任务。 在Linux系统中,正则表达式通常以“行”为单位进行处理,并且可以使用转义字符(如`\`)来控制特殊字符的行为

      • 正则表达式的意义

        • 处理大量的字符串 处理文本. 通过特殊符号的辅助,可以让linux管理员快速过滤、替换、处理所需要的字符串、文本,让工作高效。通常Linux运维工作,都是面临大量带有字符串的内容,如 配置文件 程序代码 命令输出结果 日志文件 且此类字符串内容,我们常会有特定的需要,查找出符合工作需要的特定的字符串,因此正则表达式就出现了 正则表达式是一套规则和方法 正则工作时以单位进行,一次处理一行 正则表达式化繁为简,提高工作效率 linux仅受三剑客 (sed、awk、grep)支持,其他命令无法使用 正则表达式应用非常广泛,应用在如Python、Java、Per等,Linux下普通命令无法使用正则表达式的,只能使用三剑客。

      • 通配符

        • 通配符和正则表达式,都有 * ? [abcd] 符号 通配符中,都是用来标识任意的字符 如 ls *.log 可以找到 a.log b.log ccc.log

        • 通配符是大部分普通命令都支持的,用于查找文件或目录,而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的

      • BRE集合

        • 匹配字符 匹配次数 位置锚定

          • grep “^$”ck.txt -n 找到ck文件的空行 grep “^$”ck.txt -n -v 找到ck文件的非空行 grep "^#" ck.txt找出没有注释井号开头的行 grep "^#" ck.txt -v | grep "^$" -v 找到ck文件没有注释和空行的行

          • ^的用法 grep “^i” ck.txt -n -i 找到ck文件中以i开头的 点的用法 grep -n "\.$" ck.txt找出以点结尾的行(加上转义符,被当做正常字符处理) grep -n ".$" ck.txt匹配任意字符结果的(点被当做正则表达式了) grep "." ck.txt -n -i 找出ck.txt非空行 grep ".ab" ck.txt -n -i找出任意三个字符包含ab ^$组合符 grep "^$" ck.txt -n 找到空行 *的用法匹配前一个字符0次或多次 grep "I*" ck.txt 输出源文件,i标红显示 grep "I*" ck.txt -o 直接显示出每行的i .*组合符代表匹配所有内容,以及空格 grep “.*” ck.txt 匹配所有内容 grep “.*e” ck.txt 匹配以e结尾的所有行

          • [abc]中括号 “^"符号在中括号中第一位表示排除 中括号表达式,[abc]表示匹配中括号中任意一个字符,a或b或c,常见形式如下 [a-z]匹配所有小写单个字母 [A-Z]匹配所有单个大写字母 [a-zA-Z]匹配所有的单个大小写字母 [0-9]匹配所有单个数字 [a-zA-Z0-9]匹配所有数字和字母

            • grep“[a-z]” ck.txt找到小写的字母 grep“[A-Z]” ck.txt找到大写的字母 grep“[^0-5]” ck.txt找到所有非0-5的

          • 匹配次数 * :匹配前一个字符的任意次(0次至无数次) \? : 匹配前一个字符0次或1次 \+ : 匹配前一个字符1次或者多次 \{n,0\} =\{n\} :匹配前一个字符至少出现n次 \{n,m\} :匹配前一个字符至少出现n次,且最多出现m次。 \{0,n\} =\{,n\} :匹配前一个字符至多出现m次的内容 举例 grep "[root]\{3\}" file

          • 匹配字符 . : 任意一个字符 [] :指定的任意一个字符 [^] :指定范围之外的任意一个字符 .* :匹配任意个数的任意字符 .\? : 匹配任意字符出现0次或1次 []* :匹配固定格式的字符出现任意次 [:digit:] = 数字 [:lower:] =小写字母 [:upper:] =大写字母 [:alpha:] =所有字母 [:alnum:] =数字和字母 [:punct:] =所有标点符号 [:space:] =空格 举例 grep "^[[:space]]" file

          • 位置锚定 \< :词首锚定 ,用于 单词模式的左侧 >/ :词首锚定 ,用于 单词模式的左侧 \<\> :匹配完整单词 ^ :行首锚定;用于模式的最左侧 $ :行尾锚定;用于模式的最右侧 举例 grep "\<hello\>" file

          • 分组引用 \(\) :将一个或多个字符捆绑在一起,当做一个整体进行处理 \1 :模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;(可以由 \2 \3) 举例grep "\([a-z]\+\) is \1” file

        • 注意在Linux平台下,所有文件的结尾都有一个$符 可以用cat -A 查看文件

    • 扩展正则表达式(在基本正则表达式上增加(),{},?,+,|)

      • 扩展正则必须用grep -E才能生效 .:匹配任意单个字符     [ ]:匹配指定范围内的任意单个字符     [^]:匹配指定范围外的任意单个字符   次数匹配:     *:匹配其前面的字符任意次(0次、1次或多次)     ?:匹配起前面字符0次或1次     +:匹配其前面字符1次或多次     {m}:匹配其前面的字符m次     {m,n}:匹配其前面字符最少m次,最多n次     {m,}:匹配其前面字符最少m次     {,n}:匹配其前面字符最多n次   位置锚定:     ^:行首锚定     $:行尾锚定     \<或\b:词首锚定     \>或\b:词尾锚定   分组及引用:     ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中,变量为\1,\2等   或:     |:a|b表示a或者b

      • “?”符号用于匹配前一个字符0次或1次,所以“ro?t”仅能匹配rot或rt。 “()”符号通常需要和“|”符号联合使用,用于枚举一系列可替换的字符。比如说固定电话的区号和电话号码之间,可能用“-”符号或者用一个空格连接 分组过滤括起来的内容 ()内容可以被后面的“\n”正则引用 , n为数字 ,表示 引用第几个括号 的内容 \1: 表示从左侧起,第一个括号中的模式所匹配到的字符 \2:从左侧期,第二个括号中的模式所匹配到的字符 “+”符号用于匹配前一个字符1次以上,所以“ro+t”就可以匹配rot、root等。 “|”符号是“或”的意思,即多种可能的罗列,彼此间是一种分支关系。 {m}:匹配其前面的字符m次     {m,n}:匹配其前面字符最少m次,最多n次     {m,}:匹配其前面字符最少m次     {,n}:匹配其前面字符最多n次

        • grep -E "I+" ck.txt 匹配i一次或者多次 grep -E "ro?t" ck.txtp匹配前面一个字符一次或者多次 find /tmp -name "*txt" |grep -E "A|X"找出tmp下的所有有a或者x的文件 grep “r(oo|o)t” ck.txt 找到中间是oo或者o的行 grep “(r..t)*\1” ck.txt 找到所有r开头 t结尾的行 (\1分组之后向后引用) grep "y{2,4}" ck.txt -o找到y两次或者4次

    • grep与正则表达式

      • grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

      • grep [options] [pattern] [files] 命令 参数 匹配模式 文件数据 -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数(只统计匹配的行数) -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!(排除匹配结果) --color=auto为grep过滤结果添加颜色 -o只输出匹配的内容 -w只匹配过滤的内容

        • grep "login" /tmp/test_grep.txt-n 找出login有关行 grep "login" /tmp/test_grep.txtgrep-n -v 找出没有login的行 grep -I "R00T" /tmp/test_grep.txt忽略大小写,找出root grep -E "rootlsync" /tmp/test_grep.txt --color=auto 同时过滤出root和sync有关行 数#只输唷券崆暗匹配出继除的内容 grep "login" /tmp/test_grep.txt -c统计匹配结果的行数 grep "login" /tmp/test_grep.txt-n -o只输唷券崆暗匹配出继除的内容 grep"oldboy" /tmp/test_grep.txt -w#完整匹配,字符串精确匹配,整个单词 grep -E“~#l^s” /tmp/test_grep.txt过滤掉空白和注释行

  • linux三剑客

    • 文本处理工具,均支持正则表达式引擎 ·grep:文本过滤工具, (模式: pattern)工具。 sed: stream editor,流编辑器;文本编辑工具· awk:Linux的文本报告生成器 (格式化文本),Linux上是gawk

  • awk

    • AWK是一种处理文本文件的语言,是一个强大的文件分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描,过滤,统计汇总等工作,数据可以来自标准输入也可以是管道或文件

      • awk工作原理 当读到第一行时,匹配条件,然后执行指定动作,在接着读取第二行数据处理,不会默认输出。 如果没有定义匹配条件,则是默认匹配所有数据行,awk隐含循环,条件匹配多少次,动作就会执行多少次。 逐行读取文本,默认以空格或tab键为分割符进行分割,将分割所得的各个字段,保存到内建变量中,并按模式或或条件执行编辑命令

      • 格式1: awk 【选项】 '模式或条件{操作} ' 文件名 格式2: awk -f 脚本文件 文件名

      • 行与列 行 称为记录record,每一行默认通过回车来分割的 列称为字段、域field每一列默认通过空格分割的 符号 >,<,>=,<=,!=,==

        • 内置变量 $0:当前处理行的所有记录   $n:当前记录的第n个字段,字段间由分隔符分隔     awk -F: '{print $1,$3}'    NF:当前记录的字段数(列数)            //awk -F: 'print NF'   $NF:最后一列                   //$(NF-1)表示倒数第二列   FNR/NR:行号   FS:定义输入间隔符                  //awk 'BEGIN{FS=":"};{print $1,$3}'  此时跟awk -F: '{print $1,$3}'是一样的   OFS:定义输出字段分隔符,默认空格          //awk -F: 'BEGIN{OFS="==>"};{print $1,$3}',输出的$1==>$3,也可以awk -F: '{print $1"==>"$3}这么写   RS:输入记录分隔符,默认换行            //awk -F: 'BEGIN{RS="\t"};{print $1,$3}',相当于以\t来分隔列

        • 取列 -F指定分隔符 指定每一列结束标记(默认是空格,连续的空格,tab键) $数字 取出某一列,注意:在awk中$内容一个意思表示取出某一列 $0 表示取出所有列,即整行内容 {print xxx) 设置分割符 FS -F:===-vFS=: FS字段分隔符,每个字段结束标记 方法1:-F可以指定分隔符 方法2:-v FS="xx"设置分隔符,其中-v表示修改awk变量,FS是分隔符变量 OFS 输出字段分割符(awk显示每一列的时候,每一列之间通过什么fenge)  NF:当前记录的字段数(列数)$NF表示最后一列            //awk -F: 'print NF' ls -l |awk'{print $5,$9}'| column -t取出第五列和第九列 column -t对齐 awk'{print $5,$NF}' /et/password | column -t取出第一列和最后一列 awk -v OFS=:'{print $NF,$2,$3,$4,$5,$6,$1}' /et/password | column -t最后一列和第一列调换位置 awk"NR==2,NR==5{print "第"NR"行:"$0}ck.txt 取出第二行到第五行的所有列

    • 执行过程

    • 模式匹配

      • 命令 选项 ‘模式{动作}’ 或叫 ‘条件{动作}’ awk -F“[/.]+” ‘pattern{action}’ ‘NR==3{print $3}’ 谁可以作为awk的条件 比较符号: > < >= <= == != 正则 范围 表达式 特殊条件:BEGIN 与 END

        • awk‘条件1{动作1} 条件2{动作2}…’ 文件名 条件(Pattern): 一般使用关系表达式作为条件。这些关系表达式非常多,例如: x > 10 判断变量x是否大于10 x == y 判断变量x是否等于变量y A ~ B 判断字符串A中是否包含能匹配B表达式的子字符串 A !~ B 判断字符串A中是否不包含能匹配B表达式的子字符串 动作(Action) : 格式化输出 流程控制语句 常用参数: -F 指定输入时用到的字段分隔符 -v 自定义变量 -f 从脚本中读取awk命令 -m 对val值设置内在限制

      • 正则匹配

        • //支持扩展正则 awk可以精确到某一列,某一列中包含/不包含......内容 ~包含 !~包含

          • 正则 awk正则 表示以....开头的行 某一列的开头 $表示以....结尾的行 某一列的结尾 ^$表示空行 某一列是空的

            • awk -F:'$3~/^[12]/{print $1,$3,$NF} /etc/passwd找出 第3列以1或者2开头的行,并显示第1列,第3列和最后一列 awk -F:'$3~/^1/' /etc/passwd第三列以1开头的行 awk -F:'$3~/^2/{print $1,$3,$NF}' /etc/passwd找出 第3列以2开头的行,并显示第1列,第3列和最后一列 awk -F:'$3~/^1|2/{print $1,$3,$NF}' /etc/passwd找出 第3列以1开头有2的行,并显示第1列,第3列和最后一列 awk -F:'$3~/^1|^2]/{print $1,$3,$NF}' /etc/passwd找出 第3列以1或者2开头的行,并显示第1列,第3列和最后一列 awk -F:'$3~/^(1|2)]/{print $1,$3,$NF}' /etc/passwd找出 第3列以1或者2开头的行,并显示第1列,第3列和最后一列

      • 范围模式

        • /开始/,/结束/ 举例 awk '/11:02:00/,/11:02:30/{print $1}'access.1og NR==2, NR==4 表示从第2行到第5行 类似 sed -n '2,4p'

      • 特殊模式

        • BEGIN{} 读取文件前执行的内容 1)进行简单统计,计算,不涉及读取文件(常见) 2)用来处理文件之前,添加个表头(了解) 3)用来定义awk变量(很少用因为可以用-v)

        • END{} 读取文件后执行的内容 1)awk进行统计,一般过程: 先进行计算,最后END里面输出结果(常见) 2)awk使用数组,用来输出数组结果.(常见)

          • 统计方法: I++计数,统计次数 sum=sum+? 求和累加 I,sum都是变量 awk "/^$/{i++}END{print i}' /etc/services

      • 比较符号参考取行部分awk -F"[/]+" 'NR==3{print $3}'

    • 数组

      • 统计日志 统计次数统计每个ip出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者ip出现次数 累加求和:统计每个ip消耗的流量 array[]++ 要统计什么[]就是某一列 awk -F"[/.]+{array[$2]++}END{for(i in array)print i,array[i]}' ck.txt

      • awk字母 会被识别为变量,如果只是想使用字符串需要使用双引号引起来 awk 'BEGIN{a[o]=cc;a[l]=kk; print a[o],a[1]}' awk'BEGIN{a[0]=123;a[l]="ck"; for(i in a) print i}'输出的是索引 awk'BEGIN{a[0]=2306;a[l]="ck"; for(i in a) print a[i]}'输出变量内容 awk -F"[/.]+" '{array[$2]++} END {for(i in array) print i, array[i]}' url.txt -F"[/.]+": 这个参数指定了字段分隔符 -F,使用正则表达式 [/.]+ 周围不需要引号,这样可以匹配一个或多个 . 或 / 字符。 '{array[$2]++}: 这是 awk 的 action 部分,它表示对于每一行,都将第二个字段($2)作为索引,数组 array 中相应元素的值加一,即统计每个不同的第二字段的出现次数。 END {for(i in array) print i, array[i]}: END 块在处理完所有的输入行之后执行。在这个块中,使用 for 循环遍历数组 array,并打印每个索引(即第二字段的值)及其在文本文件中的出现次数。

    • 判断和循环

      • for循环

        • 用来循环每个字段的 for(i=1,I<100,I++) print i

        • awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum3}'

      • if判断

        • if (条件) print “输出”

        • awk使用多个条件的时候 第1个条件可以放在 条件{动作了’ 第2个条件 一般使用if df -h lawk -F"[ %]+" 'NR>1{if($5>=1)print "disk not enough",$1,$5,SNF}

  • sed

    • sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在 临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完 成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾

      • 语法: sed 参数 "[定位 指令]" 文件路径 -e 允许多项编辑 -r 扩展正则 -n 取消默认输出(模式空间的内容输出) -i 写入文件 改变了输出流向,对源文件修改 (把流向屏幕的内容,流入文件中) -i.bak 修改文件时会创建备份文件,防止手误 -a 指定行后添加信息 -i 指定行前添加信息 -f 指定sed脚本文件名

    • sed和vim的区别 sed可以把处理文件的规则事先写好,然后用一套规则处理,vim只能一个一个编辑,成批次处理用sed处理比较好 sed处理文件一次内存中只有一行,不会对内存造成过大的压力。

    • 增删改查之查找

      • sed -查找p "1p" "2p"指定行号查找 sed -n '3p' ck.txt指定行号输出 ‘1,5p’指定行号范围查找 sed -n '3,$p' ck.txt从第三行到最后一行,$表示最后一行的意思 '/ck/p'类似grep,//可以写正则 sed -n '/[0-9]/p' ck.txt这一行有0-9输出 ‘/10:00/,/11:00/p’表示范围的过滤

    • 增删改查之删除(删除整行)

      • 1d 删除第1行的内容 sed -n '1d' ck.txt 1,5d 删除1行到5行的内容 sed -n '1,5d' ck.txt 2,+5d 删除第2行以及往下的5行的内容 /pattern1/d 删除每行中匹配到pattern1的行内容 /pattern1/,/pattern2/d 删除匹配到pattern1的行直到匹配到pattern2的所有行内容 /pattern1/,10d 删除匹配到pattern1的行到10行的所有行内容 10,/pattern1/d 删除第10行直到匹配到pattern1的所有内容 sed -nr '/^$|#/!p' ck.txt 空行#不显示

    • 增删改查之增加

      • 增加cai c replace替代这行的内容 sed '3c 996,ckUFO'cktxt a append 追加,向指定的行或每一行追加内容(行后面)>> sed '3a 996,ckUFO'\ 000 ck cktxt i insert 插入向指定的行或每一行插入内容(行前面)

    • 增删改查之替换

      • s###g前面的替换成后面的sed's#[0-9]##' ck.txt

      • 反向引用

        • echo 123456|sed -r 's#(.*)#<\1>#g' echo ck_li sed -r's#(~.*)_(.*$)#\2 1#g echo 123456:打印字符串 "123456" 到标准输出。 |:管道符,将前一命令的标准输出作为后一个命令的标准输入。 sed -r:调用 sed 命令并启用扩展正则表达式。 's#(.*)#<\1>#g':这是 sed 的替换命令,其中: s:表示替换操作。 #:作为分隔符,通常 sed 使用 / 作为默认的分隔符,但是可以使用任何其他字符,例如此处的 #。使用其他字符作为分隔符在处理包含默认分隔符 / 的文本时非常有用,避免了转义的需要。 (.*):这是一个捕获组,. 匹配任何单个字符(除换行符之外),* 表示匹配0次或多次。在这种情况下,.* 将会匹配整个输入的字符串,即 "123456"。 <\1>:替换文本,其中 \1 引用了第一个(在这个示例中也是唯一的)捕获组,即匹配到的整个字符串 "123456"。< 和 > 被添加到替换文本的两侧。 g:全局替换标志,意味着替换将在整行范围内进行。

  • awk和sed

    • sed命令常用于一整行的处理。而awk比较倾向于将一行分成多个 “ 字段 ” 然后再进行处理。awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符。(&&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。)

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南棋网络安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值