一 什么是正则

  正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。

生活中处处都是正则:

    比如我们描述:4条腿

      你可能会想到的是四条腿的动物或者桌子,椅子等

    继续描述:4条腿,活的

          就只剩下四条腿的动物这一类了

在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则。

二. grep

参数

-n  :显示行号-o  :只显示匹配的内容-q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

-l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc -A  :如果匹配成功,则将匹配行及其后n行一起打印出来-B  :如果匹配成功,则将匹配行及其前n行一起打印出来-C  :如果匹配成功,则将匹配行及其前后n行一起打印出来--color-c  :如果匹配成功,则将匹配到的行数打印出来-E  :等于egrep,扩展-i  :忽略大小写

-v  :取反,不匹配-w:匹配单词

[root@MiWiFi-R3-srv ~]# cat a.txt root123ROot asdfRoot_123rOOtssroot 123
[root@MiWiFi-R3-srv ~]# grep -i "root" a.txt root123ROot asdfRoot_123rOOtssroot 123
[root@MiWiFi-R3-srv ~]# grep -w "root" a.txt root 123

grep种类:  grep  fgrep  pgrep  egrep

正则介绍:

  ^ 行首  $ 行尾  . 除了换行符以外的任意单个字符  * 前导字符的零个或多个  .* 所有字符  [] 字符组内的任一字符  [^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)  ^[^] 非字符组内的字符开头的行  [a-z] 小写字母  [A-Z] 大写字母  [a-Z] 小写和大写字母  [0-9] 数字  \< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词  \> 单词尾

扩展正则 sed 加 -r 参数 或转义grep 加 -E 或 egrep 或转义AWK 直接支持 但不包含{n,m}可以使用--posix支持

[root@MiWiFi-R3-srv ~]#  awk '/ro{1,3}/{print}' /etc/passwd

[root@MiWiFi-R3-srv ~]#  awk --posix '/ro{1,3}/{print}' /etc/passwdsed -n '/roo\?/p' /etc/passwd sed -rn '/roo?/p' /etc/passwd? 前导字符零个或一个+ 前导字符一个或多个abc|def abc或defa(bc|de)f abcf 或 adefx\{m\} x出现m次x\{m,\} x出现m次至多次(至少m次)x\{m,n\} x出现m次至n次posix定义的字符分类

[:alnum:] Alphanumeric characters.  匹配范围为 [a-zA-Z0-9][:alpha:] Alphabetic characters.  匹配范围为 [a-zA-Z][:blank:] Space or tab characters.  匹配范围为 空格和TAB键[:cntrl:] Control characters.  匹配控制键 例如 ^M 要按 ctrl+v 再按回车 才能输出[:digit:] Numeric characters.  匹配所有数字 [0-9][:graph:] Characters that are both printable and visible. (A space is print-able, but not visible, while an a is both.)  匹配所有可见字符 但不包含空格和TAB 就是你在文本文档中按键盘上能用眼睛观察到的所有符号[:lower:] Lower-case alphabetic characters.  小写 [a-z][:print:] Printable characters (characters that are not control characters.)  匹配所有可见字符 包括空格和TAB  能打印到纸上的所有符号[:punct:] Punctuation characters (characters that are not letter, digits, con-trol characters, or space characters).  特殊输入符号 +-=)(*&^%$#@!~`|\"'{}[]:;?/>.<,  注意它不包含空格和TAB  这个集合不等于^[a-zA-Z0-9][:space:] Space characters (such as space, tab, and formfeed, to name a few).

[:upper:] Upper-case alphabetic characters.  大写 [A-Z][:xdigit:] Characters that are hexadecimal digits.  16进制数 [0-f]

使用方法:[root@seker ~]# grep --color '[[:alnum:]]' /etc/passwd

三. sed

sed:  流编辑器 stream editer,是以行为单位的处理程序

  sed 流编辑器 stream editer

语法:  sed [options] 'command' in_file[s]  options 部分  -n  -e  -i  -f  command 部分  '[地址1,地址2] [函数] [参数(标记)]'  定址的方法 1.数字 2.正则数字:  十进制数  1 单行   1,3 范围 从第一行到第三行  2,+4 匹配行后若干行  4,~3 从第四行到下一个3的倍数行  2~3 第二行起每间隔三行的行  $ 尾行  1! 除了第一行以外的行正则:  正则必须用//包裹起来  扩展正则需要用 -r 参数或转义

  数字定址:sed -n '1p' /etc/passwd

  正则定址:sed -n '/^root/p' /etc/passwd正则介绍:

  扩展正则 加 -r 参数 或转义  sed -n '/roo\?/p' /etc/passwd   sed -rn '/roo?/p' /etc/passwd  ? 前导字符零个或一个  + 前导字符一个或多个  abc|def abc或def  a(bc|de)f abcf 或 adef  x\{m\} x出现m次  x\{m,\} x出现m次至多次(至少m次)  x\{m,n\} x出现m次至n次

函数:(增删改)

  a 后插  c 替换  i 前插  d 删除  输入输出  p 打印匹配的行 一般和 -n 参数连用,以屏蔽默认输出  r 从文件中读入  w 写入到文件中控制流:  ! 命令取反 例: 1!d 删除第一行以外的行  {} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法

  = 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile  n 读入下一行到模式空间 例:'4{n;d}' 删除第5行  N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令

替换:  s 字符串替换 s/old/new/  $ sed -n 's/root/ABCDEF/p' /etc/passwd  ABCDEF:x:0:0:root:/root:/bin/bash

  operator:x:11:0:operator:/ABCDEF:/sbin/nologin

  $ sed -n 's/root/ABCDEF/gp' /etc/passwd  ABCDEF:x:0:0:ABCDEF:/ABCDEF:/bin/bash

  operator:x:11:0:operator:/ABCDEF:/sbin/nologin

  $ sed -n 's/root/ABCDEF/2p' /etc/passwd

  root:x:0:0:ABCDEF:/root:/bin/bash

  $ sed -n 's/root/ABCDEF/3p' /etc/passwd

  root:x:0:0:root:/ABCDEF:/bin/bash

  $ sed -n 's/root/ABCDEF/gp' /etc/passwd

  ABCDEF:x:0:0:ABCDEF:/ABCDEF:/bin/bash

  operator:x:11:0:operator:/ABCDEF:/sbin/nologin$

\(\) 保存被匹配的字符 以备反向引用\N时使用 最多9个标签 标签顺序从左至右& 替换时使用,在不定义标签时使用(反向引用)

试做:  删除第一个单词

  删除最后一个单词

  将第一个单词和最后一个单词兑换位置

  y 字符替换(变形)

  工作模式 模式空间和保持空间介绍

$ sed '1{p;p}' a.txt

  11111111

  11111111

  11111111

  22222222

  33333333

  44444444

  55555555

  66666666

$

置换 模式空间和保持空间(暂存空间)h 把模式空间内容覆盖到保持空间中H 把模式空间内容追加到保持空间中g 把保持空间内容覆盖到模式空间中G 把保持空间内容追加到模式空间中x 交换模式空间与保持空间的内容

# cat test.sh   1111111  2222222   3333333  4444444# sed '{1h;2,3H;4G}' ./test.sh   1111111  2222222  3333333  4444444  1111111  2222222  3333333# sed '{1h;2x;3g;$G}' ./test.sh   1111111  1111111  2222222  4444444  2222222#

试做题

将第一行插入到每个偶数行的后面

$ sed '1h;0~2G' a.txt

  1111111

  22222222

  11111111

  33333333

  44444444

  11111111

  55555555

  66666666

  11111111

$

颠倒输出

$ sed '1!G;h;$!d' rev.txt

  xyz

  def

  abc

$

脚本方法-f 参数 引用脚本(脚本的末尾不能有空格制表符或其他文本)# cat sed.sh 2,4ds/777/seker/s/999/seker&seker/# sed -f sed.sh test.txt 111111155555556666666seker77778888888seker999seker9999#

在脚本中指明解释器为sed# cat sed.sh #!/bin/sed -f2,4ds/777/seker/s/999/seker&seker/# ./sed.sh test.txt 111111155555556666666seker77778888888seker999seker9999#

高级流控命令 b分支 t测试分支命令用于无条件转移,测试命令用于有条件转移

分支 branch跳转的位置与标签相关联如果有标签则跳转到标签所在的后面行继续执行如果没有标签则跳转到脚本的结尾处.标签 以冒号开始后接标签名 不要在标签名前后使用空格跳转到标签指定位置[root@stu254 ~]# grep seker /etc/passwdseker:x:500:500::/home/seker:/bin/bash[root@stu254 ~]#[root@stu254 ~]# grep seker /etc/passwd |sed ':top;s/seker/blues/;/seker/b top;s/5/555/' blues:x:55500:500::/home/blues:/bin/bash[root@stu254 ~]#

命令分析:让单次替换(cmd1)循环执行,直到条件不满足:top; 定义一个top标签s/seker/blues/; cmd1/seker/b top; 如果模式匹配则跳转到top标签s/5/555/ 当上一条模式不匹配时,既会继续执行这一条

选择执行[root@stu254 ~]# grep 'seker' /etc/passwd |sed 's/seker/blues/;/seker/b end;s/5/555/;:end;s/5/666/'blues:x:66600:500::/home/seker:/bin/bash[root@stu254 ~]#

zorro:x:501:501::/home/zorro:/bin/bash[root@stu254 ~]# grep 'zorro' /etc/passwd |sed 's/seker/blues/;/seker/b end;s/5/555/;:end;s/5/666/'zorro:x:6665501:501::/home/zorro:/bin/bash[root@stu254 ~]#

命令分析: 执行cmd1,再去模式匹配,成功则跳转到cmd3开始执行,否则(模式不匹配)会按命令顺序逐个执行s/seker/blues/; cmd1/seker/b end;s/5/555/; cmd2:end;s/5/666/ cmd3

另一种选择执行[root@stu254 ~]# grep 'seker' /etc/passwd |sed 's/seker/blues/;/seker/b end;s/5/555/;b;:end;s/5/666/'blues:x:66600:500::/home/seker:/bin/bash

[root@stu254 ~]# grep 'zorro' /etc/passwd |sed 's/seker/blues/;/seker/b end;s/5/555/;b;:end;s/5/666/'zorro:x:55501:501::/home/zorro:/bin/bash[root@stu254 ~]#

命令分析: 执行cmd1;模式匹配cmd2成功则执行cmd3;否则执行cmd2,再跳转到脚本末尾 s/seker/blues/; cmd1/seker/b end;s/5/555/; cmd2b;:end;s/5/666/ cmd3

测试命令,如果前一个替换命令执行成功则跳转到脚本末尾 (case结构)[root@stu254 ~]# grep 'seker' /etc/passwd |sed 's/seker/ABC/;t;s/home/DEF/;t;s/bash/XYZ/'ABC:x:500:500::/home/seker:/bin/bash

[root@stu254 ~]# grep 'zorro' /etc/passwd |sed 's/seker/ABC/;t;s/home/DEF/;t;s/bash/XYZ/'zorro:x:501:501::/DEF/zorro:/bin/bash[root@stu254 ~]#

与标签关联,跳转到标签位置[root@stu254 ~]# grep 'seker' /etc/passwd |sed 's/seker/ABC/;t end;s/home/DEF/;t;:end;s/bash/XYZ/'ABC:x:500:500::/home/seker:/bin/XYZ[root@stu254 ~]#

[seker@seker ~]$ grep 'zorro' /etc/passwd |sed 's/seker/ABC/;t end;s/home/DEF/;t;:end;s/bash/XYZ/'zorro:x:501:501::/DEF/zorro:/bin/bash

四 .awk

awk -F: '$1 == "root"{print $1,NR,NF}' /etc/passwdawk -F: 'NR>20 || NR<3{print $1,$3,$NF}' /etc/passwdawk -F: 'NR>1 && NR<3{print $1,NR,NF}' /etc/passwdawk -F: 'NR>1 && NR<4{print $1,NR,NF}' /etc/passwdawk -F: '$1~/^r/{print $1,NR,NF}' /etc/passwdawk -F: '/^root/{print $1,NR,NF}' /etc/passwd

username=rootawk -v var=$username -F: '$1 == var{print $1,NR,NF}' /etc/passwd

awk详细

语法awk [options] 'commands' filesoption-F 定义字段分隔符,默认的分隔符是连续的空格或制表符使用option中的-F参数定义间隔符号用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域NF变量表示当前记录的字段数-v 定义变量并赋值 也可以借用次方式从shell变量中引入

command读前处理 行处理 读后处理1.读前处理 BEGIN{awk_cmd1;awk_cmd2}2.行处理:定址 命令 定址方法: 正则,变量,比较和关系运算正则需要用//包围起来 ^ 行首$ 行尾. 除了换行符以外的任意单个字符* 前导字符的零个或多个.* 所有字符[] 字符组内的任一字符[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)^[^] 非字符组内的字符开头的行[a-z] 小写字母[A-Z] 大写字母[a-Z] 小写和大写字母[0-9] 数字\< 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词\> 单词尾

扩展正则 加 -r 参数 或转义sed -n '/roo\?/p' /etc/passwd sed -rn '/roo?/p' /etc/passwd? 前导字符零个或一个+ 前导字符一个或多个abc|def abc或defa(bc|de)f abcf 或 adefx\{m\} x出现m次x\{m,\} x出现m次至多次(至少m次)x\{m,n\} x出现m次至n次

NR变量定址 NR 表示AWK读入的行数FNR表示读入行所在文件中的行数# awk '{print NR,FNR,$1}' file1 file2 1 1 aaaaa2 2 bbbbb3 3 ccccc4 1 dddddd5 2 eeeeee6 3 ffffff#逻辑运算 可直接引用域进行运算== >= <= != > < ~ !~# awk 'NR==1 {print}' /etc/passwdroot:x:0:0:root:/root:/bin/bash3.命令 {print $0}4.读后处理 END {awk_cmd1;awk_cmd2;}

AWK变量NR 当前记录的个数(全部文件连接后的统计) FNR 当前记录的个数(仅为当前文件的统计,非全部)FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]OFS 输出字符的分隔符 默认是空格# awk -F: 'OFS="=====" {print $1,$2}' /etc/passwdroot=====xNF 当前读入行的字段个数ORS 输出记录分隔符 默认是换行# awk -F: 'ORS="=====" {print $1,$2}' /etc/passwdroot x=====bin x=====FILENAME 当前文件名

引用shell变量的方法# a=root# awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd或者 把整个命令拆开传递,让shell变量外露,# awk -F: '$1 == "'$a'" {print $0}' /etc/passwd# a=NF# awk -F: '{print $'$a'}' /etc/passwd

操作符赋值= += -= /= *= 逻辑与 逻辑或 逻辑非&& || !匹配正则或不匹配,正则需要用 /正则/ 包围住~ !~关系 比较字符串时要把字符串用双引号引起来< <= > >= != ==字段引用$ 字段引用需要加$,而变量引用直接用变量名取运算符+ - * / % ++ --转义序列\\ \自身\$ 转义$\t 制表符\b 退格符\r 回车符\n 换行符\c 取消换行

流程控制

分支结构

if (条件) 动作若有多个动作,则要用大括号将动作体包含起来 if (条件) {动作1;动作2}# awk -F: '{if ($1 == "root") print $1}' /etc/passwdroot# awk -F: '{if ($1 == "root") {print $1;print $6}}' /etc/passwdroot/root#if (条件1)动作1else动作2# awk -F: '{if ($1 == "root"){print $1}else print $6}' /etc/passwd# awk -F: '{if ($1 == "root") print $1;else print $6}' /etc/passwd上面两个命令是等价的,要么用分号隔开,表示第一个动作体的结束,要么将动作体用大括号定位范围if (条件 1)动作1else if(条件 2)动作2else if(条件 3)动作3else动作4# awk -F: '{if ($1 == "root") print $1;else if ($1 == "seker") print $6;else if ($1 == "zorro") print $7;else print NR}' /etc/passwdroot23...33/home/seker/bin/bash36

条件 ? 动作1 : 动作2expr?action1:action2# awk -F: 'var=($3 >= 500)?$1:"system_user" {print $1"\t"$3"\t"var}' /etc/passwd# awk -F: '{print ($3>500?$1:$2)}' /etc/passwd

输出样式

%s是字符类型,%d数值类型
printf默认是不输出换行的所以要加\n
10和7是偏移量
默认是右对齐,所有加个- 就是左对齐,就是把不足的位数用空格填充
注意:格式与输出列之间要有逗号
# awk -F: '{printf "%-10s %-10d %s\n",$1,$3,$7}' /etc/passwd

读前处理和读后处理# awk -F: 'BEGIN{i=1} {i++} END {print i}' /etc/passwd47## awk -F: 'BEGIN {print NR,NF}' /etc/passwd0 0# awk -F: 'END {print NR,NF}' /etc/passwd46 7#练习找出普通用户的用户名并统计数量 # awk -F: 'BEGIN{i=0} $3 >= 500 {print $1;i++} END {print i}' /etc/passwd计算UID相加的总和;计算GID相加的总和# awk -F: 'BEGIN{i=0}{sum+=$3;i++}END{print i;print sum}' /etc/passwd # awk -F: 'BEGIN{i=0}{sum+=$3;gsum+=$4;i++}END{print i;print sum;print gsum}' /etc/passwd计算VSZ和RSS各自的和 并以M单位显示# ps aux | awk 'BEGIN{i=0}NR>=2{sum+=$5;i++}END{print sum/1024"M"}'# ps aux | awk 'BEGIN{i=0}NR>=2{vsum+=$5;rsum+=$6;i++}END{print vsum/1024"M";print rsum/1024"M";print i}'循环语句while(条件) {动作条件运算}# awk -F: '{while($3<3) {print $3,$1;$3++}}' /etc/passwd0 root1 root2 root1 bin2 bin2 daemonBEGIN块可以独立使用,不需要引入文件# awk 'BEGIN{i=1;while(i<100) {print i;i++}}'练习打印100以内的偶数# awk 'BEGIN{i=1;while(i<100) {if (i%2==0) print i;i++}}'x=1do {动作1x++} while (x<5)# awk 'BEGIN{i=5;do{print i;i++}while(i<10)}'# awk 'BEGIN{i=5;do{print i;i++}while(i<1)}'

for(预置;条件;递增) {动作}# awk 'BEGIN {for (x=1;x<=4;x++) print x }'1234## awk 'BEGIN{for (i=1;i<=4;i++) {for (j=1;j<=4;j++) print i,j}}'

*使用嵌套的for循环,打印100-999之间的数,个十百位分别用一个for来打印# awk 'BEGIN{OFS="";for (i=1;i<=9;i++) {for (j=0;j<=9;j++) {for (n=0;n<=9;n++) print i,j,n}}}'打印乘法口诀表# cat 99.sh #!/bin/bashawk 'BEGIN{for(i=1;i<10;i++){for(j=1;j<=i;j++)printf "%d*%d=%d ",j,i,j*iprint}

}'#

打印金字塔# cat jin.sh #!/bin/bashawk 'BEGIN{num=5for(i=1;i<=num;i++){ for (n=1;n<=num-i;n++)printf "%s"," "for (j=1;j<=2*i-1;j++)printf "%s","*"print}}'#

逆序输出每个字段达到这样既可/bin/bash/rootroot00xroot

# awk -F: '{for (x=NF;x>0;x--) print $x}' /etc/passwd

继续解决上一个试做题的格式问题# awk -F: '/bash$/{for (x=NF;x>0;x--) printf "%-13s",$x;printf "\n"}' /etc/passwd

跳转语句break 跳出循环# awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) break;print x }}'12continue 在达到循环底部之前终止当前循环 从新开始下一次循环# awk 'BEGIN {for(x=1;x<5;x++) {if (x==3) continue;print x }}'124

next 读入下一行 同时返回脚本顶部 这样可以避免对当前行执行其他操作# awk -F: 'NR > 5 {next} {print $1} END {print NR}' /etc/passwdrootbindaemonadmlp46exit 使读取动作终止 并将控制移动到END,如果没有END则终止脚本# awk -F: 'NR > 5 {exit} {print $1} END {print NR}' /etc/passwdrootbindaemonadmlp6#

数组自定义数组# awk 'BEGIN {ary[1]="seker";ary[2]="zorro";print ary[1],ary[2]}'seker zorro## awk 'BEGIN {ary[1]="seker";ary[2]="zorro";for(i in ary) print ary[i]}'sekerzorro#删除一个元素 对元素给空值并不能清除这个元素 要想清除一个元素需要使用delete ary[idx]# awk 'BEGIN {ary[1]="seker";ary[2]="zorro";ary[3]="blues";ary[2]="";for(i in ary) print ary[i]}'seker

blues# awk 'BEGIN {ary[1]="seker";ary[2]="zorro";ary[3]="blues";delete ary[2];for(i in ary) print ary[i]}'sekerblues#

循环产生数组和取出数组# awk 'BEGIN{n=5;for (i=1;i<=n;i++) ary[i]=i+100;for(m in ary) print m,ary[m]}'4 1045 1051 1012 1023 103# awk -F: '{ary[NR]=$1} END {for(i in ary) print i,ary[i]}' /etc/passwd1 root2 bin3 daemon4 adm5 lp6 sync7 shutdown8 halt9 mail# awk -F: '{ary[$3]=$1} END {for(i in ary) print i,ary[i]}' /etc/passwd10 uucp11 operator12 games13 gopher14 ftp32 rpc37 rpm

ARGV 命令行中参数数组# awk '{for (i in ARGV) {print i,ARGV[i]}}' /etc/passwd /etc/fstab0 awk1 /etc/passwd2 /etc/fstab#### i 为下标; ARGV[i] 下标为i的值练习统计每种shell被使用的次数

函数

算术函数 int[root@stu254 ~]# awk 'BEGIN {print int(3.9415)}'3[root@stu254 ~]#

随机数函数 rand() srand()rand() 取值 0 > r < 1 之间 默认的种子是系统时间 精确到秒srand()取值 0 > r < 1 之间 可以指定种子来影响rand()取值数 默认是系统时间 精确到秒

[root@stu254 ~]# awk 'BEGIN {srand(222);print int(rand()*100000000)}'90204196[root@stu254 ~]#

字符串函数substr(s,x[,y])返回字符串s中从位置x起至y的子串,如果没有给出y,则从x开始到结束.[root@stu254 ~]# awk 'BEGIN {x="abcdefxyz";print substr(x,4,3)}'def[root@stu254 ~]#

大写小写sprintf() 本身并不能打印,做格式转换,将数字转换成ASCII字符# awk 'BEGIN {for(i=97;i<=122;++i) print tolower(toupper(sprintf("%c",i)))}'

字符串长度length() 如果没有给定字符串则使用$0[root@stu254 ~]# awk 'BEGIN {print length("abcdefxyz")}'9

gsub(/abc/,"ABC",x) 全局字符串替换从x中用匹配的abc正则替换成ABC [root@stu254 ~]# awk 'BEGIN {x="xyzabcxyzabcxyz";gsub(/abc/,"ABC",x);print x}'xyzABCxyzABCxyz[root@stu254 ~]# sub 第一次的替换[root@stu254 ~]# awk 'BEGIN {x="xyzabcxyzabcxyz";sub(/abc/,"ABC",x);print x}'xyzABCxyzabcxyz[root@stu254 ~]#

gensub(r, s, h [, t]) Search the target string t for matches of the reg-ular expression r. If h is a string beginningwith g or G, then replace all matches of r with s.Otherwise, h is a number indicating which match ofr to replace. If t is not supplied, $0 is usedinstead.gensub(正则,替换,范围,目标串)[root@tch254 ~]# awk 'BEGIN{print gensub("zorro","AAAA","2","seker zorro zorro seker")}'seker zorro AAAA seker[root@tch254 ~]# echo seker zorro zorro seker | sed 's/zorro/AAAA/2'seker zorro AAAA seker[root@tch254 ~]# [root@tch254 ~]# echo seker zorro zorro seker | awk '{$0=gensub("zorro","AAAA","g");print}'seker AAAA AAAA seker[root@tch254 ~]# echo seker zorro zorro seker | awk '{$0=gensub("zorro","AAAA","2");print}'seker zorro AAAA seker[root@tch254 ~]# echo seker zorro zorro seker | awk '{$0=gensub("zorro","AAAA","h");print}'seker AAAA zorro seker[root@tch254 ~]# echo seker zorro zorro seker | awk '{$0=gensub("zorro","AAAA","1");print}'seker AAAA zorro seker[root@tch254 ~]#

系统函数getline

交互输入[root@stu254 ~]# awk -F: 'BEGIN {printf "Enter Number: ";getline ;for(i=1;i<=$0;i++) print i}'Enter Number: 3123[root@stu254 ~]#

将输入赋值给变量[root@stu254 ~]# awk -F: 'BEGIN {printf "Enter Number: ";getline NUM;for(i=1;i<=NUM;i++) print i}'Enter Number: 3123[root@stu254 ~]#

从文件中读入[root@tch254 ~]# awk -F: 'BEGIN {getline < "/etc/passwd" ; print $3"\t"$1}'0 root[root@tch254 ~]#

#awk -F: 'BEGIN {while (getline < "/etc/passwd" > 0) print $3"\t"$1}'

getline < "/etc/passwd" 从文件中读入,每次读取一行,默认情况下读取的次数等于awk自身引入文件的行数也可以放到for中来控制读取的次数> 0 测试读取的返回值,成功返回1,失败返回-1,0文件末尾

从命令输出中输入[root@stu254 ~]# awk 'BEGIN {"uname -a"|getline ;print $3}'2.6.18-53.el5[root@stu254 ~]#

system(command)系统命令要用""引起来[root@stu254 ~]# rm -rf abc/[root@stu254 ~]# awk 'BEGIN {if(system("mkdir abc") != 0 ) print "ERR"}'[root@stu254 ~]# awk 'BEGIN {if(system("mkdir abc") != 0 ) print "ERR"}'mkdir: 无法创建目录 “abc”: 文件已存在ERR[root@stu254 ~]#[root@tch254 ~]# awk 'BEGIN {if(system("mkdir abc 2>/dev/null") != 0 ) print "ERR"}'ERR[root@tch254 ~]#

awk脚本的介绍 -f 与 #!/bin/awk -f

使用awk添加系统用户[root@mail ~]# cat useradd.awk #!/bin/awk -f

{system("useradd "$1";echo "$2"|passwd --stdin "$1)}[root@mail ~]# cat username myname 1234[root@mail ~]# [root@mail ~]# ./useradd.awk ./username Changing password for user myname.passwd: all authentication tokens updated successfully.[root@mail ~]#

五 其他补充

[root@MiWiFi-R3-srv ~]# cat test |sort |uniq #排序去重

11111111111
2222222222
333333333
4444444444
55555555555
6666666666
777777777777
888888888888
99999999999999
aaaaaaaaaa

[root@MiWiFi-R3-srv ~]# cat /etc/passwd |cut -d: -f2

[root@MiWiFi-R3-srv ~]# find / -size +2M -type f -name \*.txt

正则表达式和文本处理工具相关推荐

  1. Shell第二篇:正则表达式和文本处理工具

    一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则:     比如我们描述:4条腿   ...

  2. Linux正则表达式和文本处理工具(gred、awk、sed)

    使用Linux 的 gred.awk.sed 可以方便得处理文本,然而若要灵活使用这三个工具,首先必须理解正则表达式.这里先对正则表达式进行学习,做点记录,之后再练习一下文本处理工具的使用. 正则表达 ...

  3. linux正则表达式与文本处理工具

    目录 一.基础正则表达式 二.文本处理工具 (1)grep命令 (2)cut.sort.uniq.tr cut   !列截取工具 ! sort排序工具 uniq去重工具 tr修改工具 一.基础正则表达 ...

  4. Shell编程之正则表达式与文本编辑器

    一.正则表达式 1.正则表达式概述 通常用于判断语句中,用来检查某一字符串是否满足某一格式 正则表达式是由普通字符与元字符组成 普通字符包括大小写字母.数字.标点符号及一些其他符号 元字符是指在正则表 ...

  5. 第六章,文本处理工具和正则表达式

    更多笔记点击查看 Linux学习从入门到打死也不放弃,完全笔记整理(持续更新) https://blog.51cto.com/13683480/2095439 笔记整理起始时间:2018年4月7日14 ...

  6. Shell程序设计 | 文本处理工具 :正则表达式、grep、sed、awk

    文章目录 正则表达式 grep sed awk 其它常用工具 cut sort uniq tr 常见面试题 第十行 有效电话号码 统计词频 转置文件 要想使用这些流式处理工具,那么就必须得了解正则表达 ...

  7. linux隔行打印文本,详解正则表达式及Linux三大文本处理工具

    grep.sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了. 一.正则表达式 1.匹配字符的类型 [ ...

  8. 文本处理工具--正则表达式

    在学习linux中文本搜索是很重要的 对于初学者来说如何快速学会运用正则表达式相当重要的. 文本搜索工具,根据用户指定的文本搜索模式(搜索条件)对目标进行逐行搜索,显示能匹配的行. 文本搜索: gre ...

  9. 正则表达式与常用文本处理工具

    正则表达式与常用文本处理工具 正则表达式概述 基础正则表达式 基础正则表达式元字符 扩展正则表达式 概述 扩展元字符 文本处理器 grep 示例 sed sed 命令 示例 输出文件内容 删除符合条件 ...

最新文章

  1. anago 围棋_跳进我的碗里—关于中惒围棋加盟那些事
  2. golang编译错误 copying /tmp/go-build069786374/b001/exe/a.out: No such file or directory 解决方法
  3. 【测试】ESP32天线信号强度比较,小龟小车A2天线esp32cam板载外置天线测试数据...
  4. Go游戏服务器开发的一些思考(十):goroutine和coroutine
  5. jsp给前端注入值失败_基于 qiankun 的微前端最佳实践(图文并茂) 应用间通信篇...
  6. mybatis resultType resultMap
  7. 高并发编程知识体系阅读总结
  8. Java 并发和多线程(一) Java并发性和多线程介绍[转]
  9. Python_装饰器精讲_33
  10. 完整版通达OA2015-2017版本1day漏洞利用
  11. 两个需求理论:马斯洛需求层次理论和KANO模型
  12. 微信公众平台接入广告投放系统
  13. 小白终是踏上了这条不归路----小文的mysql学习笔记(23)---------流程控制结构
  14. 串的基本操作与KMP算法
  15. WICC | 风口之下,音视频社交出海的三大新机遇
  16. 间隔十年重新更新微博
  17. python 列表作业
  18. ASCII码对照表【2022年汇总】
  19. html5带拖拽上传的图片gallary
  20. 抖音如何查看访客记录,丨国仁网络

热门文章

  1. 快递取件码生成软件_一种快递柜取件码生成装置及其使用方法与流程
  2. java计算机毕业设计基于微信小程序的校园外卖订餐系统APP
  3. django之 报错(1146, “Table ‘demo2.web‘ doesn‘t exist“)
  4. 随机生成数猜大小(java实现)
  5. iOS开发:GitHub上传代码错误提示fatal: Authentication failed for 'https://gitee.com/XXX/XXX.git/‘的解决方法
  6. Android直播中弹幕效果实现
  7. 3. 乱石穿空,惊涛拍岸,卷起千堆雪。 2. 故垒西边,人道是,三国周郎赤壁。 4. 江山.... hai太乱了,我们来写程序排序输出到磁盘文件中
  8. Spire操作word文档
  9. java 拼图游戏_Java 拼图游戏
  10. 计算机工作理想湿度,计算机理想的工作温度七月的盛夏,碧空中没有一丝云彩,只剩下纯(9)...