网站优化销售话术,吉林长春网络公司有哪些,网站空间怎么申请,微信小程序线上商城怎么申请一、正则表达式
Shell正则表达式分为两种#xff1a;
基础正则表达式#xff1a;BRE#xff08;basic regular express#xff09;
扩展正则表达式#xff1a;ERE#xff08;extend regular express#xff09;#xff0c;扩展的表达式有、?、|和()
1.1 基本正则表…一、正则表达式
Shell正则表达式分为两种
基础正则表达式BREbasic regular express
扩展正则表达式EREextend regular express扩展的表达式有、?、|和()
1.1 基本正则表达式 1.2 扩展正则表达式 1.3 支持正则表达式的工具
grep默认不支持扩展表达式加-E选项开启ERE。如果不加-E使用花括号要加转义符\{\}
egrep支持基础和扩展表达式
awk支持egrep所有的正则表达式
sed默认不支持扩展表达式加-r选项开启ERE。如果不加-r使用花括号要加转义符\{\}
二、grep
过滤来自一个文件或标准输入匹配模式内容。 除此之外还有
grep -f从文件每一行获取匹配模式
grep -m输出匹配的结果num数
grep -H打印每个匹配的文件名
grep -h不输出文件名
grep -q不输出正常信息
grep -s不输出错误信息
grep -r递归目录
grep -B打印匹配的前几行
grep -A打印匹配的后几行
grep -C打印匹配的前后几行
grep --color匹配的字体颜色
1输出b文件在a文件相同的行 grep -f a b
2输出b文件在a文件不同的行 grep -v -f a b
3匹配多个模式 echo a bc de |xargs -n1 |grep -e a -e bc
a
bc
注xargs为多行输出-n1表示一行输出1个参数
4去除文件内的空行和#开头的行一般用于查看配置文件 grep -E -v ^$|.*# /etc/httpd/conf/httpd.conf
5匹配开头不分大小写的单词 echo A a b c |xargs -n1 |grep -i a
A
a
6只显示匹配的字符串 echo this is a test |grep -o is
is
is
7输出匹配的前五个结果 seq 1 20 |grep -m 5 -E [0-9]{2}
10
11
12
13
14 8统计匹配多少行 seq 1 20 |grep -c -E [0-9]{2}
11
9匹配b字符开头的行 echo a bc de |xargs -n1 |grep ^b
bc
10匹配de字符结尾的行并输出匹配的行 echo a ab abc abcd abcde |xargs -n1 |grep -n de$
5:abcde
11递归搜索/etc目录下包含ip的conf后缀文件
grep --include只检索匹配的文件 grep -r 192.167.1.1 /etc --include *.conf
12排除搜索bak后缀的文件
grep --exclude跳过匹配的文件 grep -r 192.167.1.1 /opt --exclude *.bak
13匹配所有IP ifconfig |grep -E -o [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
14打印匹配结果及后3行 seq 1 10 |grep 5 -A 3
5
6
7
8
15打印匹配结果及前3行 seq 1 10 |grep 5 -B 3
2
3
4
16打印匹配结果及前后3行 seq 1 10 |grep 5 -C 3
2
3
4
5
6
7
8
三、sed
流编辑器过滤和替换文本。
工作原理sed命令将当前处理的行读入模式空间进行处理处理完把结果输出并清空模式空间。然后再将下一行读入模式空间进行处理输出以此类推直到最后一行。还有一个空间叫保持空间又称暂存空间可以暂时存放一些处理的数据但不能直接输出只能放到模式空间输出。
这两个空间其实就是在内存中初始化的一个内存区域存放正在处理的数据和临时存放的数据。
语法格式sed [选项] 地址 命令 file 借助一些文本内容作为示例
[rootopenEuler-1 script]# cat sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
3.1 匹配打印p
1打印匹配blp5开头的行
[rootopenEuler-1 script]# sed -n /^blp5/p sed.txt
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator2打印第一行
[rootopenEuler-1 script]# sed -n 1p sed.txt
nimgtw 48003/udp # Nimbus Gateway3打印第一行至第三行
[rootopenEuler-1 script]# sed -n 1,3p sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services4打印奇数行
[rootopenEuler-1 script]# seq 10 | sed -n 1~2p
1
3
5
7
95打印匹配行及后一行
[rootopenEuler-1 script]# sed -n /blp5/,1p sed.txt
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator6打印最后一行
[rootopenEuler-1 script]# sed -n $p sed.txt
iqobject 48619/udp # iqobject7不打印最后一行
感叹号也就是对后面的命令取反。
[rootopenEuler-1 script]# sed -n $!p sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject8匹配范围blp5开头的行~com开头的行
以逗号分开两个样式选择某个范围。
[rootopenEuler-1 script]# sed -n /^blp5/,/^com/p sed.txt
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw3.2 匹配删除d
删除与打印使用方法类似打印是把匹配的打印出来删除是把匹配的删除删除只是不用-n选项。
1删除包含blp5的行
[rootopenEuler-1 script]# sed /^blp5/d sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject2删除1~3行
[rootopenEuler-1 script]# sed 1,3d sed.txt
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
3去除http.conf文件空行和开头#号的行
[rootopenEuler-1 script]# sed /^$/d;/.*#/d /etc/httpd/conf/httpd.conf3.3 替换s///
1替换blp5字符串为test
[rootopenEuler-1 script]# sed s/blp5/test/ sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
test 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject2替换开头是blp5的字符串并打印
[rootopenEuler-1 script]# sed -n s/blp5/test/p sed.txt
test 48129/tcp # Bloomberg locator
test 48129/udp # Bloomberg locator3使用命令引用匹配内容并替换
[rootopenEuler-1 script]# sed s/48049/.0/ sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049.0/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject4给IP加引号
g全局替换
[rootopenEuler-1 script]# echo 192.168.121.11 172.1.1.2 223.5.5.5 | sed -r s/[^ ]/“”/g
“192.168.121.11” “172.1.1.2” “223.5.5.5”5对1-5行的blp5进行替换
[rootopenEuler-1 script]# sed 1,5s/blp5/test/ sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject6对匹配行进行替换
[rootopenEuler-1 script]# sed /48129\/tcp/s/blp5/test/ sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject7二次匹配替换
[rootopenEuler-1 script]# sed s/blp5/test/;s/3g/4g/ sed.txt
nimgtw 48003/udp # Nimbus Gateway
4gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
test 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject8注释匹配行后的多少行
[rootopenEuler-1 script]# seq 10 | sed /5/,3s/^/#/
1
2
3
4
#5
#6
#7
#8
9
103.4 多重编辑-e
[rootopenEuler-1 script]# sed -e 1,2d -e s/blp5/test/ sed.txt
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
test 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject# 也可以使用分隔
[rootopenEuler-1 script]# sed 1,2d;s/blp5/test/ sed.txt
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test 48129/tcp # Bloomberg locator
test 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject3.5 添加新内容ai、c
1在blp5上一行添加test
[rootopenEuler-1 script]# sed /blp5/i \test sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test
blp5 48129/tcp # Bloomberg locator
test
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject2在blp5下一行添加test
[rootopenEuler-1 script]# sed /blp5/a \test sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
test
blp5 48129/udp # Bloomberg locator
test
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject3将blp5替换新行
[rootopenEuler-1 script]# sed /blp5/c \test sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
test
test
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject3.6 读取文件并追加到匹配行后r
[rootopenEuler-1 script]# cat a.txt
123
456
[rootopenEuler-1 script]# sed /blp5/r a.txt sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
123
456
blp5 48129/udp # Bloomberg locator
123
456
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject3.7 将匹配行写入文件w
[rootopenEuler-1 script]# sed /blp5/w b.txt sed.txt
nimgtw 48003/udp # Nimbus Gateway
3gpp-cbsp 48049/tcp # 3GPP Cell Broadcast Service Protocol
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject
[rootopenEuler-1 script]# cat b.txt
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator3.8 读取下一行n和N
n 读取下一行到模式空间。
N 追加下一行内容到模式空间并以换行符\n分隔。
1打印匹配的下一行
[rootopenEuler-1 script]# seq 5 |sed -n /3/{n;p}
4
2打印偶数
[rootopenEuler-1 script]# seq 10 | sed -n n;p
2
4
6
8
10
# sed先读取第一行1执行n命令获取下一行2此时模式空间是2
# 执行p命令打印模式空间。 现在模式空间是2sed再读取3
# 执行n命令获取下一行4此时模式空间为4执行p命令以此类推.
3打印奇数
[rootopenEuler-1 script]# seq 10 |sed n;d
1
3
5
7
9
# sed先读取第一行1此时模式空间是1并打印模式空间1
# 执行n命令获取下一行2执行d命令删除模式空间的2sed再读取3
# 此时模式空间是3并打印模式空间再执行n命令获取下一行4
# 执行d命令删除模式空间的3以此类推.
3.9 打印和删除模式空间的第一行P和D
P 打印模式空间的第一行。
D 删除模式空间的第一行。
1打印奇数
[rootopenEuler-1 script]# seq 6 | sed -n N;P
1
3
52保留最后一行
[rootopenEuler-1 script]# seq 6 | sed N;D
6
# 读取第一行1执行N命令读取下一行并追加到模式空间
# 此时模式空间是1\n2执行D命令删除模式空间第一行1剩余2.
# 读取第二行执行N命令此时模式空间是3\n4
# 执行D命令删除模式空间第一行3剩余4,以此类推.
3.10 保持空间操作h与H、g与G和x
h 复制模式空间内容到保持空间覆盖。
H 复制模式空间内容追加到保持空间。
g 复制保持空间内容到模式空间覆盖。
G 复制保持空间内容追加到模式空间。
x 模式空间与保持空间内容互换。
1将匹配的内容覆盖到另一个匹配
[rootopenEuler-1 script]# seq 6 | sed -e /3/{h;d} -e /5/g
1
2
4
3
6
# h命令把匹配的3复制到保持空间d命令删除模式空间的3.
# 后面命令再对模式空间匹配5并用g命令把保持空间3覆盖模式空间5.
2将匹配的内容放到最后
[rootopenEuler-1 script]# seq 6 | sed -e /3/{h;d} -e $G
1
2
4
5
6
3
# 这里的$代表最后一行G表示将保持空间的内容追加到当前行的后面
3交换模式空间和保持空间
[rootopenEuler-1 script]# seq 6 | sed -e /3/{h;d} -e /5/x -e $G
1
2
4
3
6
5
# 在模式空间匹配5并将保持空间的3与5交换5就变成了3.
# 最后把保持空间的5追加到模式空间.
4倒序输出
[rootopenEuler-1 script]# seq 5 |sed 1!G;h;$!d
5
4
3
2
1
# 1!G 第一行不执行把保持空间内容追加到模式空间因为现在保持空间还没有数据
# h 将模式空间放到保持空间暂存
# $!d 最后一行不执行删除模式空间的内容。
5每行后面添加新空行
[rootopenEuler-1 script]# seq 5 |sed G
12345
3.11 忽略大小写匹配I
[rootopenEuler-1 script]# echo -e a\nA\nb\nc |sed s/a/1/Ig
1
1
b
c3.12 获取总行数
[rootopenEuler-1 script]# seq 10 |sed -n $
10四、awk
awk 是一个处理文本的编程语言工具能用简短的程序处理标准输入或文件、数据排序、计算以及 生成报表等。
基本的命令语法awk option pattern {action} file
其中pattern表示AWK在数据中查找的内容而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。
awk 处理的工作方式与数据库类似支持对记录和字段处理这也是grep和sed不能实现的。在awk中缺省的情况下将文本文件中的一行视为一个记录逐行放到内存中处理而将一行中的某一部分作为记录中的一个字段。用1,2,3...数字的方式顺序的表示行记录中的不同字段。用$后跟数字引用对应的字段以逗号分隔0表示整个行。 4.1 选项、模式 1从文件读取awk程序处理文件
[rootopenEuler-1 script]# cat test.awk
{print $2}
[rootopenEuler-1 script]# tail -n3 /etc/services | awk -f test.awk
45514/udp
45514/tcp
46998/tcp2指定分隔符打印指定字段默认以空格分割
[rootopenEuler-1 script]# tail -n3 /etc/passwd | awk -F: {print $1}
apache
mysql
nginx3指定多个分隔符作为同一个分隔符处理
[rootopenEuler-1 script]# tail -n3 /etc/services
cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
spremotetablet 46998/tcp # Capture handwritten signatures[rootopenEuler-1 script]# tail -n3 /etc/services | awk -F[/#] {print $1}
cloudcheck-ping 45514
cloudcheck 45514
spremotetablet 46998
[rootopenEuler-1 script]# tail -n3 /etc/services | awk -F[/#] {print $2}
udp
tcp
tcp
[rootopenEuler-1 script]# tail -n3 /etc/services | awk -F[/#] {print $3}ASSIA CloudCheck WiFi Management keepaliveASSIA CloudCheck WiFi Management SystemCapture handwritten signatures
4变量赋值
[rootopenEuler-1 script]# awk -v a123 BEGIN{print a}
1235输出awk全局变量到文件
[rootopenEuler-1 script]# seq 5 | awk --dump-variables {print $0}
1
2
3
4
5
[rootopenEuler-1 script]# cat awkvars.out
ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: %.6g
ENVIRON: array, 25 elements
ERRNO:
FIELDWIDTHS:
FILENAME: -
FNR: 5
FPAT: [^[:space:]]
FS:
FUNCTAB: array, 41 elements
IGNORECASE: 0
LINT: 0
NF: 1
NR: 5
OFMT: %.6g
OFS:
ORS: \n
PREC: 53
PROCINFO: array, 21 elements
RLENGTH: 0
ROUNDMODE: N
RS: \n
RSTART: 0
RT: \n
SUBSEP: \034
SYMTAB: array, 28 elements
TEXTDOMAIN: messages6BEGIN和END
BEGIN模式是在处理文件之前执行该操作常用于修改内置变量、变量赋值和打印输出的页眉或标 题。END模式是在程序处理完才会执行。
示例
[rootopenEuler-1 script]# cat frequent_ip.sh
#!/bin/bash
#########################
#File name:frequent_ip.sh
#Email:obboda163.com
#Created time:2025-01-14 11:46:11
#Description:访问nginx日志得到访问ip最多的前10个
#########################log_path/var/log/nginx/access.log# 拿取按照访问次数排序过的ip
sort_dataawk {print $1} /var/log/nginx/access.log | sort | uniq -c# 按照sort_data的数据进行优化处理打印输出
echo $sort_data | awk
BEGIN{printf %-10s %-10s %-10s \n,访问排名,访问IP,访问次数}
{printf %-10s %-20s %-10s \n,NR,$2,$1}
END{print end............}[rootopenEuler-1 script]# bash frequent_ip.sh
访问排名 访问IP 访问次数
1 192.168.121.1 8
2 192.168.121.12 3
3 192.168.121.13 2
4 192.168.121.131 1
5 192.168.121.51 4
end............4.2 内置变量 1FS和OFS
在程序开始前重新赋值FS变量改变默认分隔符为冒号与-F一样。
[rootopenEuler-1 script]# head -n5 /etc/passwd | awk BEGIN{FS:}{print $1,$2}
root x
bin x
daemon x
adm x
lp x# 也可以使用-v来重新赋值这个变量并指定输出分隔符
[rootopenEuler-1 script]# head -n5 /etc/passwd | awk -vFS: {print $1,$2}
root x
bin x
daemon x
adm x
lp x# 也可以指定输出分隔符
[rootopenEuler-1 script]# head -n5 /etc/passwd | awk BEGIN{FS:;OFS#}{print $1,$2}
root#x
bin#x
daemon#x
adm#x
lp#x
2RS和ORS
# 指定以某个字符作为分隔符来处理记录
[rootopenEuler-1 script]# echo www.baidu.com/user/test.html |awk BEGIN{RS/}{print $0}
www.baidu.com
user
test.html# 将输出的换行符替换为号
[rootopenEuler-1 script]# seq 10 | awk BEGIN{ORS}{print $0}
12345678910[rootopenEuler-1 script]#
3NF
# NF是字段个数
[rootopenEuler-1 script]# echo a b c d e f | awk {print NF}
6# 打印最后一个字段
[rootopenEuler-1 script]# echo a b c d e f | awk {print $NF}
f4NR和FNR
NR统计记录编号每处理一行记录编号就会1FNR不同的是在统计第二个文件时会重新计数。
[rootopenEuler-1 script]# tail -n5 /etc/services | awk {print NR,$0}
1 axio-disc 35100/udp # Axiomatic discovery protocol
2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
5 spremotetablet 46998/tcp # Capture handwritten signaturesNR和FNR的区别
[rootopenEuler-1 script]# awk {print NR,FNR,$0} a b
1 1 a
2 2 b
3 3 c
4 1 d
5 2 e
6 3 f5ARGC和ARGV
ARGC是命令行参数数量
ARGV是将命令行参数存到数组元素由ARGC指定数组下标从0开始
[rootopenEuler-1 script]# awk BEGIN{print ARGC} 1 2 3
4
[rootopenEuler-1 script]# awk BEGIN{print ARGV[0],ARGV[1]} 1 2 3
awk 16ARGIND
ARGIND是当前正在处理的文件索引值第一个文件是1第二个文件是2以此类推从而可以通过这种方式判断正在处理哪个文件。
[rootopenEuler-1 script]# awk {print ARGIND,$0} a b
1 a
1 b
1 c
2 d
2 e
2 f7ENVIRON
ENVIRON调用系统变量。
[rootopenEuler-1 script]# awk BEGIN{print ENVIRON[HOME]}
/root8FILENAME
FILENAME是当前处理文件的文件名。
[rootopenEuler-1 script]# awk {print FILENAME,$0} a b
a a
a b
a c
b d
b e
b f9IGNORECASE
IGNORECASE1表示忽略大小写
[rootopenEuler-1 script]# echo A a b c |xargs -n1 |awk BEGIN{IGNORECASE1}/a/
A
a4.3 操作符 注意在awk中有3种情况表达式为假数字是0空字符串和未定义的值。且数值运算未定义变量初始值为0。字符运算未定义变量初始值为空。
1截取整数
[rootopenEuler-1 script]# echo 123abc abc123 123abc123 |xargs -n1 | awk {print $0}
123
0
123[rootopenEuler-1 script]# echo 123abc abc123 123abc123 |xargs -n1 | awk {print -$0}
-123
0
-123
2打印奇数偶数行
# 打印奇数行
[rootopenEuler-1 script]# seq 6 | awk i!i
1
3
5# 打印偶数行
[rootopenEuler-1 script]# seq 6 | awk !(i!i)
2
4
63管道符的使用
[rootopenEuler-1 script]# seq 5 | shuf | awk {print $0|sort}
1
2
3
4
5
# 其中shuf会将原来的顺序打乱
4三目运算符
[rootopenEuler-1 script]# awk BEGIN{print 11?yes:no}
yes4.4 流程控制
1if语句
格式if (condition) statement [ else statement ]
# 单分支
[rootopenEuler-1 script]# seq 5 | awk {if($03)print $0}
3# 双分支
[rootopenEuler-1 script]# seq 5 |awk {if($03)print $0;else print no}
no
no
3
no
no2while语句
格式while (condition) statement
[rootopenEuler-1 script]# echo 1 2 3 4 5 | awk {i1;while(iNF){print $i;i}}
1
2
3
4
53for语句C语言风格
格式for (expr1; expr2; expr3) statement
[rootopenEuler-1 script]# cat file
1 2 3
4 5 6
7 8 9
[rootopenEuler-1 script]# awk {for(i1;iNF;i)print $i} file
1
2
3
4
5
6
7
8
94for语句遍历数组
格式for (var in array) statement
[rootopenEuler-1 script]# seq -f str%.g 5 |awk {a[NR]$0}END{for(v in a)print v,a[v]}
1 str1
2 str2
3 str3
4 str4
5 str55break和continue语句
break跳过所有循环continue跳过当前循环。
[rootopenEuler-1 script]# awk BEGIN{for(i1;i5;i){if(i3){break};print i}}
1
2
[rootopenEuler-1 script]# awk BEGIN{for(i1;i5;i){if(i3){continue};print i}}
1
2
4
56exit语句
格式exit [ expression ]
exit退出程序与shell的exit一样。[ expr ]是0-255之间的数字。
[rootopenEuler-1 script]# seq 5 |awk {if($0~/3/)exit (123)}
[rootopenEuler-1 script]# echo $?
1234.5 内置函数 [rootopenEuler-1 script]# cat c
123abc
abc123
123abc123
[rootopenEuler-1 script]# awk {print int($0)} c
123
0
1234.6 I/O语句 # 获取匹配行的下一行
[rootopenEuler-1 script]# seq 5 |awk /3/{getline;print}
44.7 printf语句
格式化输出默认打印字符串不换行。
格式printf [format] arguments # 左对齐宽度10
[rootopenEuler-1 script]# awk BEGIN{printf %-10s %-10s %-10s\n,ID,Name,Passwd}
ID Name Passwd