本文主要是介绍【awk】1-awk基础篇(又名UNIX.She…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
导读:
1,awk基本语法
2,比较操作符
3,复合表达式
4,next命令
5,变量及变量赋值
6,awk中的赋值操作符
7,BEGIN和END
8,内置变量
9,awk使用shell变量
10,awk中的三种流控制语句
10.1 if语句
10.2 while语句:
10.3 for语句:
11,实验:
12,shell里的特殊变量
正文:
1,awk基本语法
awk ‘script’
script 由下面的结构组成 /pattern/{actions}
例子:打印fruit_prices.txt文件的内容
[root@master bkeep]# awk '{print;}' fruit_prices.txt
fruit
banana
peach
kiwi
pineapple
apple
TIPS:留意printf的用法 如果加“-”说明是左对齐!
[root@master bkeep]# awk '{printf "%-15s %s\n", $1, $3;}' fruit_prices.txt
fruit
banana
peach
kiwi
pineapple
apple
留意printf的用法 如果不加“-”说明是右对齐!
[root@master bkeep]# awk '{printf "s %s\n", $1, $3;}' fruit_prices.txt
例子:给价格高于1美元的水果加个星号
[root@master bkeep]# cat fruit_prices.txt
fruit
banana
peach
kiwi
pineapple
apple
[root@master bkeep]# cat price.sh
#!/bin/bash
awk '
' fruit_prices.txt
执行结果:
[root@master bkeep]# ./price.sh
banana
peach
kiwi $1.50 22 *
pineapple $1.29 35 *
apple
上面的格式很不好看,我们改改它吧!
TIPS:$0:awk使用变量0原原本本地存储它所读入的整个输入行。这样可以保持和原来文本格式相同的输出
[root@master bkeep]# cat price.sh
#!/bin/bash
awk '
' fruit_prices.txt
[root@master bkeep]# ./price.sh
banana
peach
kiwi
pineapple
apple
2,比较操作符
语法:expression {actions;}
expression 可以使用以下操作符构成
<
>
<=
>=
==
!=
value ~ /pattern/
value !~ /pattern/
说明:$2 ~ /^\$[1-9][0-9]*
例子:给数量大于50的水果加星号
[root@master bkeep]# cat larger.sh
#!/bin/bash
awk '
' fruit_prices.txt
[root@master bkeep]# ./larger.sh
fruit
banana
peach
kiwi
pineapple
apple
3,复合表达式
语法:(compound expression)
(expr1)&& (expr2)
(expr1)|| (expr2)
说明一下:符合表达式必须用括号括起来
当使用&&时,expr1和expr2必须同时为零(零代表真!呵呵~),复合表达式才为真;
当使用 || 时,expr1和expr2 只要有一个为真,复合表达式则为真!
例子:显示价格高于1美元且数量少于50的水果记录,给打个标记!
[root@master bkeep]# cat larger.sh
#!/bin/bash
awk '
}
' fruit_prices.txt
[root@master bkeep]# ./larger.sh
kiwi
pineapple
4,next命令
例子:给库存少于50的水果价格标签!
[root@master bkeep]# cat next.sh
#!/bin/bash
awk '
' fruit_prices.txt
当输入行为:kiwi
脚本执行以下过程:
1)检查是否第三列的值22小于50,由于值小于50,执行脚本的第二步
2)打印该行,并在行尾添加REORDER标志
3)检查是否第三列的值22大于50,由于值不大于50,脚本读下一行
呵呵,傻子都看得出这种情况下执行第三步是多余的。那么如何跳过呢?可以使用next命令。
next命令:告诉awk跳过剩下的所有模式和表达式,并读取输入的下一行,同时从第一个模式或表达式开始处理该行!
修改后的脚本,加入了next命令!
[root@master bkeep]# cat next.sh
#!/bin/bash
awk '
' fruit_prices.txt
[root@master bkeep]# ./next.sh
fruit
banana
peach
kiwi
pineapple
apple
现在脚本执行如下;
1)检查是否第三列的值22小于50,由于值小于50,所以执行脚本第二步
2)打印输出行并在该行后打印REORDER标志(有了next后就不再执行$3 > 50 {print $0; })
3)读取下一输入行并从第一种模式开始
5,变量及变量赋值
下面给变量赋值
fruit=100
fruit=”peach”
fruit=$1
awk中的数字操作符:
+
-
*
/
%
^
应用例子:统计文件中的空行数
[root@master bkeep]# cat for.sh
#!/bin/bash
for i in $@;
do
done
[root@master bkeep]# ./for.sh aa bb
aa
7
bb
4
6,awk中的赋值操作符
+=
-=
*=
/=
%=
^=
7,BEGIN和END
awk的语法:/pattern/ {action}
这里pattern有两个特殊模式BEGIN和END
下面是BEGIN
awk ‘
BEGIN { actions }
/ pattern / { actions }
/ pattern / { actions }
END { actions }
‘
BEGIN和END都是可选的
·当指定BEGIN模式时,awk在读取任何输入前执行动作 actions
·当指定END模式时,awk在其退出前执行动作actions
这里要特别注意:比如awk读入aa.txt。那么BEGIN只在读入aa时执行一次,然后按行处理的时候不再执行BEGIN指定的action!(也可以这么理解:BEGIN只对文件生效,而不是按行生效!!);理解了BEGIN,END还会糊涂吗?呵呵!
8,内置变量
gawk语言中有几个十分有用的内置变量,现在列于下面:
NR 已经读取过的记录数。
FNR 从当前文件中读出的记录数。
FILENAME 输入文件的名字。
FS 字段分隔符(缺省为空格)。
RS 记录分隔符(缺省为换行)。
OFMT 数字的输出格式(缺省为% g)。
OFS 输出字段分隔符。
ORS 输出记录分隔符。
NF 当前记录中的字段数。
如果你只处理一个文件,则NR 和FNR 的值是一样的。但如果是多个文件, NR是对所有的文件来说的,而FNR 则只是针对当前文件而言。
例子:统计空行的脚本:
[root@master bkeep]# cat for.sh
#!/bin/bash
for i in $@;
do
#
done
[root@master bkeep]# ./for.sh aa bb
9,awk使用shell变量
经过前面的学习,我们知道shell变量的引用由$xxx 实现,而awk中的变量直接使用xxx来引用。所以我们就要思考如何让awk使用shell变量
语法:
awk
说明: awk: 命令; ‘script’:awk将要执行的脚本; awkvarN:awk的变量;value:shell中的变量值; files:将要处理的文件名
【重点实验—记忆】
例子:根据用户提供的水果数量,将低于这个值的水果打印出来!
[root@master bkeep]# cat awk_var.sh
#!/bin/bash
NUM_FRUIT="$1"
if [ -z "$NUM_FRUIT" ]; then NUM_FRUIT=75;fi
awk '
'
//赋值给num_fruit;即把shell变量赋给awk
执行结果:
[root@master bkeep]# ./awk_var.sh 40
kiwi
pineapple
[root@master bkeep]# ./awk_var.sh 30
kiwi
10,awk中的三种流控制语句
if语句
while语句
for语句
10.1 if语句
if (expression1) {action1}
else if (expression2) {action2}
else { action3}
执行过程:
1)计算expression1的值
2)若expression1为真,执行action1并推出if语句
3)若expression1为假,计算expression2
4)若expression2为真,执行action2并退出if语句
5)若expression2为假,执行action3并退出if
举例:若水果价格高于1美元,那么给它加星号;若水果数量少于50,则给它加REORDER
[root@master bkeep]# cat reorder.sh
#!/bin/bash
awk '{
}' fruit_prices.txt
执行结果:
[root@master bkeep]# ./reorder.sh
fruit
banana
peach
kiwi
pineapple
apple
10.2 while语句:
while (expression) { actions }
若expression为真,则执行actions
[root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {x+=1;print x;}}'
1
2
3
[root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {print x;x++}}'
0
1
2
Tips:do语句是while语句衍生出来的;区别在于do至少执行一次,while有可能不执行
10.3 for语句:
for (initialize_counter; test_counter;increment_counter) {
}
解释一下,呵呵
for (初始化计数器变量;测试计数器是否到顶了;增加计数器的值)
}
【常用】例子:循环迭代处理记录中的域并输出他们
[root@master bkeep]# cat for2.sh
#!/bin/bash
awk '{
}' fruit_prices.txt
[root@master bkeep]# ./for2.sh
fruitzbb
bananazbb
peachzbb
根据输出我们重点理解下awk中for循环的执行过程
1)读取一行数据
2)执行for循环,处理每一个字段,将其输出,退出for循环
3)执行第二个action即输出一个换行符
4)重复1~3,直到处理完所有行!
11,实验:
例子:倒序显示记录中的每个行
方法一:用for实现
#!/bin/bash
awk '
{a[NR]=$0};
END{for (x=NR;x>0;x-=1) {
}' fruit_prices.txt
方法2:用while实现
#!/bin/bash
awk '
{line[NR] = $0 }
END {var=NR
while (var > 0){
print line[var]
var--
}}
' fruit_prices.txt
执行结果:
[root@master bkeep]# ./re.sh
apple
pineapple
kiwi
peach
banana
fruit
12,shell里的特殊变量
# sh /usr/local/bkeep/shell.sh 001 002
I'm $0 is:/usr/local/bkeep/shell.sh
I'm $1 is:001
I'm $2 is:002
I'm $# is:2
I'm $* is:001 002
I'm $@ is:001 002
I'm $? is:0
I'm $$ is:24137
I'm $! is:
例子:再进一步解释下$*和$@吧;仔细看下面的例子,我就不废话了!
[root@master bkeep]# cat shell.sh
#!/bin/bash
cc=$*
echo "I'm \$1 is:$1"
echo "I'm \$2 is:$2"
echo "I'm \$* is:$*"
echo "I'm \$4 is:$4"
[root@master bkeep]# ./shell.sh 11 22 33 "44" 55
I'm $1 is:11
I'm $2 is:22
I'm $* is:11 22 33 44 55
I'm $4 is:44
应用例子:统计文件中的空行数
[root@master bkeep]# cat for.sh
#!/bin/bash
for i in $@;
do
done
[root@master bkeep]# ./for.sh aa bb
aa
7
bb
4
这篇关于【awk】1-awk基础篇(又名UNIX.She…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!