shell笔记,awk的使用

awk基本语法

一个awk指令由一个模式(pattern)后跟一个动作(action)组成,动作被括在{ }内,用来与模式分隔。
pattern { action }

—awk常用选项如下—

  1. -F fs——指定用于输出数据的列分割符
  2. -v var=value——在awk程序执行之前指定一个value给变量var。这些变量值用于awk程序的BEGIN块。
  3. -f program file——指定一个awk程序文件,代替在命令行指定wak命令。
  4. “–” 选项——根据POSIX参数解析约定,此选项表示命令行选项的结束。例如,利用这个选项可以指定以“-” 开头的输入文件,否则它将被解析为一个命令行选项。

运行awk主要有两种方式:

  1. 如果awk程序很短,则可以在命令行直接运行awk命令,如下
awk [OPTIONS] [--] program-text file … …
##打印/etc/passwd文件,相当于cat /etc/passwd
$ awk 'print' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
oracle:x:1002:1003::/home/oracle:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash
… …
$ awk 'BEGIN { FS=":" } $1=="lwl" {print $7}' /etc/passwd
/bin/bash
$ awk -F: '/lwl/{print $7}' /etc/passwd
/bin/bash
$ awk -F: '{print $7}' /etc/passwd | wc -l
49
##~ 表示匹配
$ awk 'BEGIN { FS=":"} ($1 ~ "lwl" || $1 ~ "mysql") {print}' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash

$ awk 'BEGIN { FS=":"} {if ($1 ~ "lwl" || $1 ~ "mysql") {print}}' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash

注释:FS变量,设置希望awk在列之间查找的字符序列

##info.txt文件中内容
$ cat info.txt 
Mat wshed(markers.size(), CV_8UC3)
printf( "execution time = %gms\n", t*1000./getTickFrequency() )
int b = theRNG().uniform(0, 255)
int g = theRNG().uniform(0, 255)
int r = theRNG().uniform(0, 255)

##NF此变量记录的是列的数量,此条语句用于输出列数超过3列行的内容
$ awk '{if (NF > 3) {print NR ".\t" $0 } }' info.txt 
2.	printf( "execution time = %gms\n", t*1000./getTickFrequency() )
3.	int b = theRNG().uniform(0, 255)
4.	int g = theRNG().uniform(0, 255)
5.	int r = theRNG().uniform(0, 255)

##特殊变量NR,用于记录当前记录的数量(awk将第一条记录记录的数字为1),此条语句用于打印info.txt中第三行以后输入记录
$ awk '{if (NR > 3) {print NR ".\t" $0 } }' info.txt 
4.	int g = theRNG().uniform(0, 255)
5.	int r = theRNG().uniform(0, 255)

##awk的 while循环语句,语法形式
## whlie(condition)
##     program-body
## whlie循环第一件事就是检查循环条件condition,如果不成立这直接执行循环外的语句,如果成立这一直执行下去,
## 如下awk语句是,打印info.txt每行的前三列。(默认以空格分隔)
$ awk '{
> i=1
> while (i <= 3) {       
>     print $i
>     i++
> }
> }' info.txt
Mat
wshed(markers.size(),
CV_8UC3)
printf(
"execution
time
int
b
=
int
g
=
int
r
=

##for循环
$ awk '{
> for ( i=1; i<=3; i++)
>     print $i
> }' info.txt
Mat
wshed(markers.size(),
CV_8UC3)
printf(
"execution
time
int
b
=
int
g
=
int
r
=

2. 当一个awk程序较长得时候,通常把他放到文件内,此方法语法:

awk [OPTIONS] -f program-file [--] file …
##同样使用info.txt文件
##创建文件名为myAWKscript 内容如下:
$ cat myAWKscript 
BEGIN {
    FS=" "
}
{ print $2}

$ awk -f myAWKscript info.txt 
wshed(markers.size(),
"execution
b
g
r
$ cat awkSearchPatternBetter.sh 
#!/bin/bash

##从标准输入读取变量pattern的直
read -p "Enter seach pattern: " pattern
##使用awk的-v选项指定pat,并将shell变量的直赋给pat变量,在处理完成打印匹配的总次数
awk -v pat="${pattern}" '$0 ~ pat { nmatches++; print} END { print nmatches, "found."}' info.txt

$ ./awkSearchPatternBetter.sh
Enter seach pattern: uniform
int b = theRNG().uniform(0, 255)
int g = theRNG().uniform(0, 255)
int r = theRNG().uniform(0, 255)
3 found.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值