转发请注明出处
awk是一个快捷脚本
首先我们先认识hello_word吧
$ echo "hello_world" | awk '{print $0}'
hello_world
一 、怎么调用awk
1. 命令行形式
cat test |awk '{print $0}'
awk '{print $0}' test
两种形式都可以
2. shell脚本 shell脚本是是awk命令
创建一个shell脚本 我弄的是awk.sh 内容如下:
#!/bin/bash
awk '{print $0}' $*
3. 单独弄个awk脚本 里面不包含awk这个就是纯‘{}’里面的内容
里面的内容必须加大括号
{print $0}
这里建议做成shell或者单独弄个文件,避免重复工作
二.awk结构
awk 【参数选项】 ‘
# 定义变量 empty_row_count
awk开始运行一遍
BEGIN{
}
# 如果是空行,则 empty_row_count+1 每个记录运行一遍
【匹配】{
}
# 打印变量 empty_row_count
最后运行输出
END{
}’ files
一)、选项参数说明:
主要是的:
1. -F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:
awk 默认每行是以‘ [ \t]+’分割的(就是输入域分隔符FS,连续多个空格为一个分割), 行分隔符是以'\n'回车(RS)
文本如下:
第1,2,3行是2个空格分割, 第4行是tab分割
更改分隔符eg1: awk '{print NF}' t2 用默认进行分割 第一行分割为2个域 最后一行也是2个行,
修改下用空格做分割:awk -F "[ ]" '{print NF}' t2 第一行变成了3个域 最后一行没有分割
如何用两个符号一起分割比如两个空格来分割,一个空格不算分割
awk -F "[ ][ ]" '{print NF}' t2
awk -F " |" '{print NF}' t2 都可以表示 只用两个空格来表示分隔符【】表示里面的符号选一个, |表示或
如何表示用两个符号都可以作为分隔符比如我用a或者b分割
awk -F "[ab]" '{print NF}' t2
awk -F "a|b" '{print NF}' t2
2. -v var=value or --asign var=value
赋值一个用户定义变量
这里注意
-v 引用$var 一定加引号。。。
我不懂shell 别笑话
以下也可以使变量带入 但是从{}执行体才可以带入,BEGIN{}没有带入, var="$var" 一定跟在awk 之后 文件之前
网上说如下方法都可行:
一:"'$var'"
这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:
var="test"
awk 'BEGIN{print "'$var'"}'
这种写法其实际是双括号变为单括号的常量,传递给了awk.
如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
var="this is a test"
awk 'BEGIN{print "'"$var"'"}'
二:'"$var"'
这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.
三.把括起awk程序的''变为"",使用"$var"
如:
$var="this is a test"
awk 'BEGIN{print "$var"}"
这是因为在""里$是特殊字符,而在''里$是普通字符.
四:export 变量,使用ENVIRON["var"]形式,
如:
$var="this is a test";export $var
awk 'BEGIN{print ENVIRON["var"]}'
3.
-f scripfile or --file scriptfile
从脚本文件中读取awk命令
上一章节已经说了
注释:
注释有两种方式,
一个是# ,一个是/*xxxxxx*/
二)、基础结构
分为BEGIN模块 {}中间模块 END结束模块
三)、内部运算符
运算符
|
描述
|
= += -= *= /= %= ^= **=
|
赋值
|
?:
|
C条件表达式
|
||
|
逻辑或
|
&&
|
逻辑与
|
~ ~!
|
匹配正则表达式和不匹配正则表达式
|
< <= > >= != ==
|
关系运算符
|
空格
|
连接
|
+ -
|
加,减
|
* / %
|
乘,除与求余
|
+ - !
|
一元加,减和逻辑非
|
^ ***
|
求幂
|
++ --
|
增加或减少,作为前缀或后缀
|
$
|
字段引用
|
in
|
数组成员
|
假如我要判定aaa在整个文件中,这里注意数组是以字典形式存储,什么都可以,不像C++, 查询时候也是查询是否在字典中,而不是字典对应的值
四)、内部函数
1、算术函数查询
函数名
|
说明
|
atan2( y, x )
|
返回 y/x 的反正切。
|
cos( x )
|
返回 x 的余弦;x 是弧度。
|
sin( x )
|
返回 x 的正弦;x 是弧度。
|
exp( x )
|
返回 x 幂函数。
|
log( x )
|
返回 x 的自然对数。
|
sqrt( x )
|
返回 x 平方根。
|
int( x )
|
返回 x 的截断至整数的值。
|
|