加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux-shell脚本命令:awk命令简介 - Linux系统

发布时间:2014-12-04 23:37:13 所属栏目:Linux 来源:站长网
导读:[ awk简介: ] awk可以从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出. [ awk工作流程: ] awk会把文件一行内容去到内存里, 然后对这行
[ awk简介: ]

awk可以从一个文本中获取部分内容, 或者对这个文本进行排版, 使它按某种格式输出.

[ awk工作流程: ]

awk会把文件一行内容去到内存里, 然后对这行内容进行分段 ( 默认按空格或tab分割, $1, $2, $3... ). 再删了, 然后读取第二行内容到内存...

格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的这一行执行命令

例如: who | awk '{print $1}'    # 把分段的第一块内容打印出来, $1为第一段,  $0为一行所有内容

[ awk参数说明: ]

-F re:允许awk更改其字段分隔符。

-v  定义变量, 从shell给awk传递变量, 如-vDATE=$DATE, 即将shell中$DATE变量值传递给awk变量DATE。

-f progfile:允许awk调用并执行progfile程序文件,当然progfile必须是一个符合awk语法的程序文件。

[ awk内置变量: ]

ARGC  命令行参数的个数

ARGV  命令行参数数组

ARGIND  当前被处理文件的ARGV标志符

awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt  # 先扫描aaa文件, 再扫描bbb文件

NR  已经读出的记录数

awk 'NR==1,NR==5{print}' aaa.txt  # 显示aaa.txt文件的 1 到 5 行

FNR  当前文件的记录数

awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt

# 输入文件a.txt和b.txt, 由于先扫描a.txt, 所以扫描a.txt的时候必然有NR==FNR;

# 然后扫描b.txt的时候, FNR从1开始计数, 而NR则接着a.txt的行数继续计数, 所以NR > FNR

FS  输入字段分隔符(缺省为:space:),相当于-F选项

awk -F ':' '{print $1}' ccc.txt  # 输入文件以 : 作为分割符

OFS  输出字段分隔符(缺省为:space:)

# 输出时以 ; 分割

① cat ccc.txt  如下:

1:2:3

4:5:6

② awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt

③ 输出结果如下:

1;2;3

4;5;6

NF  当前记录中的分段个数

awk -F ':' '{print NF}' ccc.txt

RS  输入记录分隔符, 缺省为"n", 缺省情况下, awk把一行看作一个记录; 如果设置了RS, 那么awk按照RS来分割记录

① cat ccc.txt:       hello world; I want to go swimming tomorrow;hiahia

② 运行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt

③ 结果如下:

 hello world

 I want to go swimming tomorrow

 hiahia

ORS  输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号

awk 'BEGIN{ FS="n"; RS=""; ORS=";"} {print NF}' ddd.txt

[ awk内置函数: ]

blength[([s])]                计算字符串长度(byte为单位)

length[([s])]                  计算字符串长度(character为单位)

返回栏目页:http://www.bianceng.cn/OS/Linux/

rand()                            生成随机数

srand([expr])                设置rand() seed

int(x)                             字符串转换为整型

substr(s, m [, n])           取子字符串

index(s, t)                     在字符串s中定位t字符串首次出现的位置

match(s, ere)                在字符串s中匹配正则ere,match修改RSTART、RLENGTH变量。

split(s, a[, fs])              将字符串分割到数组中

sub(ere, repl [, in])       字符串替换

gsub                              同上

sprintf(fmt, expr, ...)   拼字符串

system(cmd)                在shell中执行cmd。

toupper(s)                    字符串转换为大写

tolower(s)                    字符串转换为小写

[ awk用法示例: ]

1.  -F 表示以什么作为分隔符

awk -F: '{print $1}' ccc.txt                     # 以 : 作为分隔符, 打印出ccc.txt文件中每一行中的第一段字符串

awk -F: '{print $1,$2}' ccc.txt               # 打印第一段和第二段字符串, 如果这样写$1 $2 那么打印的内容会连在一起

2. /pattern/ 模式匹配

awk -F: '/A/{print $1}' ccc.txt               # 以 : 作为分隔符, 打印出ccc.txt文件中含有 A 的第一段字符串

3. ^ 表示以什么开头

awk -F: '/^A/{print $1}' ccc.txt             # 以 : 作为分隔符, 打印出ccc.txt文件中以 A 开头的第一段字符串

4. ~ 表示匹配的意思

awk -F: '$4 ~ /A/{print $1}' ccc.txt      # 以 : 作为分隔符, 打印出ccc.txt文件中第四段中含有 A 的字符串

5. awk在把第一行读入内存之前, 可以先做其他的一些操作, 使用BEGIN

格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file

awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt   # 读取ccc.txt文件之前, 首先执行BEGIN里的命令, 设置 : 作为分割符

awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt # 输出的分隔符以 - 进行隔开

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读