目录

Linux正则表达式

环境准备

普通字符

字符集

[…]

[a-z] [A-Z] [0-9]

[^…]

.

\

|

非打印字符

定位符

^

$

\b

\B

\< 和 >

限定次数(扩展正则表达式)

子表达式与反向引用

子表达式 ()

反向引用

应用示例:IP 地址匹配

支持正则表达式的工具

awk命令

一、awk 基础概述

1. 定位与作用

2. 特性与形式

二、awk 命令与脚本

1. 命令格式

2. 脚本结构

三、awk 工作流

四、awk 示例操作

1. 打印信息

2. 统计与判断

3. 综合示例(格式化输出雇员信息表)

五、awk 选项

1. --help 选项

2. -F 选项

3. -v 选项

4. -p 选项

六、awk 内置变量

1. 部分内置变量及说明

2. 部分变量示例

七、awk 运算符

1. 赋值运算符

2. 算术运算符

3. 自增和自减运算符

4. 关系运算符

5. 正则表达式运算符

6. 逻辑运算符

7. 三目运算符

八、awk 正则表达式

1. 字符集

2. 转义字符

3. 限定次数

4. 定位符

九、awk 语句

1. 条件语句

2. 循环语句

3. 循环控制语句

十、awk 数组

1. 创建和访问数组

2. 打印数组元素

3. 删除数组元素

4. 多维数组模拟

十一、awk 函数

1. 内置字符串函数

2. 内置算术函数

3. 内置时间函数

4. 其他内置函数

5. 用户自定义函数

十二、awk 输出处理

1. 重定向

2. 管道

3. 美化输出(printf 函数)


Linux正则表达式

  • 正则表达式作为一个pattern,将pattern与要搜索的字符串进行匹配,以便查找一个或多个字符串。

  • 正则表达式,自成体系,由普通字符(例如字符a到z)和元字符组成的文字模式。

  • 普通字符:没有显式指定为元字符的所有可打印和不可打印字符字符,包括所有大写和小写字母、所有数字、所有标点符号和其他一些符号。

  • 元字符:出了普通字符之外的字符。

  • 正则表达式,工具(vim、grep、less等)和程序语言(Perl、Python、C等)都使用正则表达式。

正则表达式分类:

  • 普通正则表达式

  • 扩展正则表示,支持更多的元字符。

环境准备

vim test_word
#写入
cat
category
acat
concatenate
dog

普通字符

cat test_words | grep 'cat'

字符集

[…]

匹配[…]中的任意一个字符

echo cbt >> test_word
cat words | grep 'c[ab]t'

[a-z] [A-Z] [0-9]

[a-z],匹配所有小写字母

[A-Z],匹配所有大写字母

[0-9],匹配所有数字

echo cAt >> test_word
echo c4t >> test_word
echo c-t >> test_word

cat test_word | grep 'c[a-z]t'
cat test_word | grep 'c[A-Z]t'
cat test_word | grep 'c[0-9]t'
cat test_word | grep 'c[a-z0-9]t'
#匹配-符号,将该符号写在第一个位置
cat test_word | grep 'c[-a-z0-9]t'

[^…]

匹配除了[…]中字符的所有字符

cat test_word | grep 'c[^ab]t'
#^放在中间会被当成普通字符
cat test_word | grep 'c[a^b]t'

.

匹配除换行符(\n\r)之外的任何单字符,相当于\[^\n\r]

\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。

例如,'n'匹配字符'n'。\n匹配换行符。序列\\匹配\,而\(则匹配(

echo c.t >> test_word
cat test_word | grep 'c\.t'

|

|符号是扩展表达式中元字符,指明两项之间的一个选择。要匹配|,需要使用\|

cat test_word | egrep 'cat|dog'
#或
cat test_word | grep -E 'cat|dog'

非打印字符

定位符

^

匹配首行位置

cat test_word | grep '^cat'

$

匹配行末位置

cat test_word | grep 'cat$'

\b

匹配一个单词边界

echo hello cat >> test_word
cat test_word | grep '\bcat'
cat test_word | grep 'cat\b'
cat test_word | grep '\bcat\b'

\B

非单词边界匹配

\< 和 >

  • \<,匹配一个单词左边界

  • \>,匹配一个单词右边界

cat test_word | grep '\<cat'
cat test_word | grep 'cat\>'

限定次数(扩展正则表达式)

用于指定子表达式的匹配次数,需配合egrepgrep -E

  • *:匹配前面的子表达式任意次(包括 0 次),例如do*g匹配dgdogdoog等。

  • +:匹配前面的子表达式至少 1 次,例如do+g匹配dogdoog等(不匹配dg)。

  • ?:匹配前面的子表达式 0 次或 1 次,例如do?g匹配dgdog(不匹配doog)。

  • {m}:匹配前面的子表达式 exactly m次,例如do{2}g匹配doog

  • {m,n}:匹配前面的子表达式mn次,例如do{2,3}g匹配doogdooog

  • {m,}:匹配前面的子表达式至少m次,例如do{2,}g匹配doogdooogdoooog等。

  • {,n}:匹配前面的子表达式最多n次,例如do{,3}g匹配dgdogdoogdooog

子表达式与反向引用

子表达式 ()

  • 标记一个子表达式,用于分组匹配,例如:

    bash

# 匹配'dog'重复2-3次的行
egrep '(dog){2,3}' words

反向引用

  • 对带括号的子表达式的匹配结果进行引用,缓冲区编号从 1 开始(\1\2…),例如:

    bash

# 匹配重复的单词(如'of of'、'up up')
echo 'Is is the cost of of gasoline going up up?' | egrep -o '\b([a-z]+) \1\b'

应用示例:IP 地址匹配

匹配合法 IP 地址的正则表达式(IPv4):

grep -E '\b(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b' ip.txt

支持正则表达式的工具

  • vim:用于搜索和替换文本

  • grep/egrep:用于文本搜索(egrep支持扩展正则)

  • less:用于文件内容查看时的搜索

  • 其他:sed、awk 等

awk命令

一、awk 基础概述

1. 定位与作用

  • awk 是 Linux 文本处理三剑客之一,另外两个是 grep(擅长过滤)和 sed(擅长修改文本),awk 擅长取列和格式化输出。

  • 可完成的任务包括文本处理、生成格式化的文本报告、运行简单的算术操作、执行常见的字符串操作等-。

2. 特性与形式

  • 更像一门编程语言,支持自定义变量、条件语句、循环、数组、正则、函数等。

  • 有三种形式:awk、gawk、nawk,平时所说的 awk 其实就是 gawk。

  • 名称来源于三位创始人 Alf ed Aho、Peter Weinerger 和 ria Kernighan 姓氏的首字符。

二、awk 命令与脚本

1. 命令格式

  • 格式一:awk [options]'script'file(s)

  • 格式二:awk [options]-f scriptfile file(s)

  • 说明:

  • script 定义如何处理数据。

  • file 是 awk 处理的数据来源,也可来自其它命令的输出。

  • -f scriptfile 从脚本文件中读取 awk 命令,每行都是一个独立的 script。

2. 脚本结构

  • 一个 awk 脚本通常由四部分组成,且通常被单引号或双引号包住:

  • BEGIN{action}:awk 执行 pattern{action} 前要执行的脚本,可用于变量初始化、打印输出表头等操作。

  • pattern{action}:决定动作语句何时触发,pattern 可以是正则表达式、关系表达式、模式匹配表达式(使用 ~ 匹配和 ~! 不匹配);action 决定对数据如何处理,由一个或多个命令、函数、表达式组成-。

  • END{action}:awk 执行 pattern{action} 后要执行的脚本,如打印所有行的分析结果。

  • 这三部分都是可选项目。

三、awk 工作流

  1. BEGIN 命令开始运行 AWK。

  2. 从输入流读取一行。

  3. 对读入的行,应用 AWK 命令。

  4. 如果存在未读取行,则重复步骤 2-3。

  5. END 命令结束运行 AWK。

四、awk 示例操作

1. 打印信息

  • 示例 1:打印雇员信息 awk '{ print }'employee.txt

  • 示例 2:通过读取 awk 脚本打印雇员信息,先创建 commands.awk 文件写入 {print },再执行 awk -f commands.awk employee.txt

  • 示例 3:输出包含 “张三” 的行 awk '/张三/{print}'employee.txt,也可简化为 awk '/张三/'employee.txt

2. 统计与判断

  • 示例 4:统计包含 “术” 的记录数

    bash

awk '/术/{count=count+1} END{ print "count="count }' employee.txt

输出结果为 count=2

  • 示例 5:输出总长度大于 10 的行,使用内置函数 length(),命令为 awk 'length($0)>10{print $0}'employee.txt

3. 综合示例(格式化输出雇员信息表)

  • 表头:使用 BEGIN 块,awk 'BEGIN{printf"序号\t名字\t部门\t年龄\n--------------"} { print }' employee.txt

  • 表尾:使用 END 块,awk 'BEGIN{printf"序号\t名字\t部门\t年龄\n--------------"} { print } END{printf"--------------"}' employee.txt

五、awk 选项

1. --help 选项

  • 用于输出 awk 命令的帮助信息,如 awk --help

2. -F 选项

  • 作用:定义 awk 程序的分隔符,默认分隔符是空格。

  • 语法:-F fs 或者 --field-separator=fs

  • 示例:打印用户名和家目录,head -n1 /etc/passwd | awk -F:'{ print $1" "$6}',输出 root /root

3. -v 选项

  • 作用:预定义一些变量,在执行 AWK 程序之前定义,在 BEGIN 语句之前已定义。

  • 示例 1:将外部值传递给 awk,VAR=10000; echo | awk -v VARABLE=$VAR '{ print VARABLE }',输出 10000

  • 示例 2:定义内部变量,var1="aaa"; var2="bbb"; echo | awk '{ print v1,v2}' v1=$var1 v2=$var2,输出 aaa bbb

4. -p 选项

  • 作用:将当前的 awk 程序代码格式化并输出到 file 文件中。

  • 格式:--profile[=file] 或者 -p[file],默认导出到 awkvars 文件中。

  • 示例:awk --profile 'BEGIN{print"---Header---\n"} {print} END{print"---Footer---\n"}' employee.txt >/dev/null,生成的 awkprof.out 会包含格式化后的代码。

六、awk 内置变量

1. 部分内置变量及说明

2. 部分变量示例

  • ARGCARGVawk 'BEGIN{ print "Arguments="ARGC; for(i=0;i<=ARGC-1;++i) {printf"ARGV[%d]=%s\n",i,ARGV[i]} }' one two three four,输出 Arguments=5 及各参数值。

  • FS:默认是空格,awk 'BEGIN{print "FS=#"FS"#"}' | cat -A 可查看。

  • NFecho -e "一 二\n一 二 三\n一 二 三 四" | awk '{ print $0 "\t",NF}',输出每行的字段数。

  • NRecho -e "一 二\n一 二 三\n一 二 三 四" | awk '{print NR"."$0}',输出带行号的内容。

七、awk 运算符

1. 赋值运算符

  • 包括 =、+=、-=、*=、/=、%=、^=、**=,如 x=5; x+=2 结果为 x=7

2. 算术运算符

  • 包括 +、-、*、/、%、^、**,如 x=5; x=x+2 结果为 x=7

3. 自增和自减运算符

  • ++--,如 x=5; y=x+++2 结果为 x=6 y=7x=5; y=++x+2 结果为 x=6 y=8

4. 关系运算符

  • 包括 <、<=、>、>=、==、!=,如 x=25; y=24; if(x>y){print x">"y} 输出 25>24

5. 正则表达式运算符

  • ~(匹配)和 !~(不匹配),如 awk '$0~"四"' employee.txt 输出包含 “四” 的行。

6. 逻辑运算符

  • 包括 &&(逻辑与)、||(逻辑或)、!(逻辑非),如 num=5; if(num>=0 && num<=7){print num"<=7"} 输出 5<=7

7. 三目运算符

  • 语法:condition expression? statement1:statement2,如 x=25; y=15; (x>y)?max=x:max=y 结果为 max=25

八、awk 正则表达式

1. 字符集

  • [^...] 匹配除了 [...] 中字符的所有字符;[a-z] 匹配所有小写字母;[A-Z] 匹配所有大写字母;[0-9] 匹配所有数字等。

  • 预定义字符集:[[:digit:]](数字)、[[:lower:]](小写字母)、[[:upper:]](大写字母)等。

2. 转义字符

  • \n 匹配换行符、\t 匹配制表符、\w 匹配字母、数字、下划线等。

3. 限定次数

  • * 匹配前面的子表达式零次或多次;+ 匹配前面的子表达式一次或多次;? 匹配前面的子表达式零次或一次;{n} 匹配确定的 n 次等。

4. 定位符

  • ^ 匹配行首位置;$ 匹配行末位置;\b 匹配单词边界等。

九、awk 语句

1. 条件语句

  • if 语句:if(condition) action,如 num=10; if (num%2==0){printf"%d is even number.\n",num} 输出 10 is even number.

  • if-else 语句:if(condition) action-1 else action-2,如判断数字奇偶。

  • if-else-if 语句:用于多个条件判断,如 a=30; if(a==10){print "a=10"} else if(a==20){print "a=20"} else if(a==30){print "a=30"} 输出 a=30

2. 循环语句

  • for 循环:for (initialization; condition; increment/decrement) action,如输出 1-5 for(i=1;i<=5;++i){print i}

  • while 循环:while (condition) action,如输出 1-5 i=1; while(i<6){print i; ++i}

  • do-while 循环:do action while (condition),如输出 1-5 i=1; do {print i; ++i} while (i<6)

3. 循环控制语句

  • break:退出当前循环,如 sum=0; for(i=0;i<20;++i){sum+=i; if(sum>50){break} else {print "sum="sum}}

  • continue:终止当前迭代,开始下一个迭代,如输出 1-20 中的偶数 for(i=1;i<=20;++i){if(i%2==0){print i} else{continue}}

  • exit:退出当前程序,如 sum=0; for(i=0;i<20;++i){sum+=i; if(sum>50){exit(10)} else {print "sum="sum}}

十、awk 数组

1. 创建和访问数组

  • 语法array_name[index] = value(创建 / 赋值);array_name[index](访问)。

  • 示例:以水果为键、颜色为值

    bash

awk 'BEGIN{
    colour["芒果"]="橘色";
    colour["橘子"]="黄色";
    colour["苹果"]="红色";
    print colour["芒果"], colour["橘子"], colour["苹果"]
}'

输出:橘色 黄色 红色

2. 打印数组元素

  • 无序循环for (i in array) {print i ":" array[i]} 示例:

    bash

awk 'BEGIN{
    colour["芒果"]="橘色"; colour["橘子"]="黄色"; colour["苹果"]="红色";
    for (i in colour) {print i ":" colour[i]}
}'

输出:苹果:红色 芒果:橘色 橘子:黄色

  • 有序循环:通过数字索引遍历(适用于连续索引数组)

    bash

awk 'BEGIN{
    colour[0]="橘色"; colour[1]="黄色"; colour[2]="红色";
    lens=length(colour);
    for(i=0;i<lens;i++) {print i ":" colour[i]}
}'

输出:0:橘色 1:黄色 2:红色

3. 删除数组元素

  • 语法delete array_name[index] 示例:删除 “橘子” 对应的元素

    bash

awk 'BEGIN{
    colour["芒果"]="橘色"; colour["橘子"]="黄色"; colour["苹果"]="红色";
    delete colour["橘子"];
    for(i in colour) {print i ":" colour[i]}
}'

输出:苹果:红色 芒果:橘色

4. 多维数组模拟

  • awk 仅支持一维数组,可通过字符串索引模拟多维数组(如 array["0,0"]=100)。 示例:

    bash

awk 'BEGIN{
    array["0,0"]=100; array["0,1"]=200; array["0,2"]=300;
    array["1,0"]=400; array["1,1"]=500; array["1,2"]=600;
    print "array[0,0]=" array["0,0"]; print "array[1,1]=" array["1,1"]
}'

输出:array[0,0]=100 array[1,1]=500

十一、awk 函数

1. 内置字符串函数

2. 内置算术函数

3. 内置时间函数

4. 其他内置函数

  • getline:从输入流读取下一行,示例:隔行打印 awk '{getline; print $0}' employee.txt

  • next:跳过当前行,处理下一行,示例:跳过 “王五” 所在行 awk '{if($2~/王五/) {next}; print $0}' employee.txt

  • nextfile:跳过当前文件,处理下一个文件

  • system(command):执行系统命令,示例:awk 'BEGIN{system("date")}' 输出当前日期

5. 用户自定义函数

  • 定义语法

    awk

function 函数名(参数1, 参数2, ...) {
    函数体;
    return 返回值;  # 可选
}
  • 示例:定义求两数最大值的函数

    bash

awk '
function max(a, b) {
    if (a > b) return a;
    else return b;
}
BEGIN { print "max(10, 20) =", max(10, 20) }
'

输出:max(10, 20) = 20

十二、awk 输出处理

1. 重定向

  • 覆盖重定向 >:清空文件后写入,示例:awk 'BEGIN{print "newdata: Hello LaoMa!">"/tmp/message.txt"}'

  • 追加重定向 >>:追加到文件末尾,示例:awk 'BEGIN{print "newdata: Hello LaoMa!">>"/tmp/message.txt"}'

2. 管道

  • 单向管道 |:将输出作为其他命令的输入,示例:awk 'BEGIN{print "hello,world!" | "tr [a-z] [A-Z]"}' 输出 HELLO,WORLD!

  • 双向管道 |&:支持双向读写,示例:通过 tr 转换大小写并读取结果

3. 美化输出(printf 函数)

  • 格式化符

  • %s(字符串)、%d(整数)、%f(浮点数)、%c(字符)等。

  • 示例:printf "姓名: %s, 年龄: %d\n", "张三", 23 输出 姓名: 张三, 年龄: 23

  • 转义字符\n(换行)、\t(制表符)、\r(回车)等,示例:printf "编号\t姓名\t部门\n" 输出带制表符的表头

更多推荐