awk是什么?awk工作原理是什么?怎么用awk?

发布时间:2020-05-28 17:50:07 作者:鸽子
来源:亿速云 阅读:1202

一、awk介绍

1. awk概述

2. awk能干啥?

  1. awk==用来处理文件和数据==的,是类unix下的一个工具,也是一种编程语言
  2. 可以用来==统计数据==,比如网站的访问量,访问的IP量等等
  3. 支持条件判断,支持for和while循环

二、awk使用方式

1. ==命令行模式使用==

1)语法结构

awk 选项 '命令部分' 文件名

特别说明:
引用shell变量需用双引号引起

2)常用选项介绍

3)=='==命名部分说明=='==

'/root/{awk语句}'             sed中: '/root/p'
'NR==1,NR==5{awk语句}'            sed中: '1,5p'
'/^root/,/^ftp/{awk语句}'     sed中:'/^root/,/^ftp/p'
'{print $0;print $1}'       sed中:'p'
'NR==5{print $0}'               sed中:'5p'
注:awk命令语句间用分号间隔
'BEGIN{awk语句};{处理中};END{awk语句}'
'BEGIN{awk语句};{处理中}'
'{处理中};END{awk语句}'

2. 脚本模式使用

1)脚本编写

#!/bin/awk -f       定义魔法字符
以下是awk引号里的命令清单,不要用引号保护命令,多个命令用分号间隔
BEGIN{FS=":"}
NR==1,NR==3{print $1"\t"$NF}
...

2)脚本执行

方法1:
awk 选项 -f awk的脚本文件  要处理的文本文件
awk -f awk.sh filename

sed -f sed.sh -i filename

方法2:
./awk的脚本文件(或者绝对路径)  要处理的文本文件
./awk.sh filename

./sed.sh filename

三、 awk内部相关变量

变量变量说明备注
==$0==当前处理行的所有记录
==\$1,\$2,\$3...\$n==文件中每行以==间隔符号==分割的不同字段awk -F: '{print \$1,\$3}'
==NF==当前记录的字段数(列数)awk -F: '{print NF}'
==$NF==最后一列$(NF-1)表示倒数第二列
==FNR/NR==行号
==FS==定义间隔符'BEGIN{FS=":"};{print \$1,$3}'
==OFS==定义输出字段分隔符,==默认空格=='BEGIN{OFS="\t"};print \$1,$3}'
RS输入记录分割符,默认换行'BEGIN{RS="\t"};{print $0}'
ORS输出记录分割符,默认换行'BEGIN{ORS="\n\n"};{print \$1,$3}'
FILENAME当前输入的文件名

1、==常用内置变量举例==

# awk -F: '{print $1,$(NF-1)}' 1.txt
# awk -F: '{print $1,$(NF-1),$NF,NF}' 1.txt
# awk '/root/{print $0}' 1.txt
# awk '/root/' 1.txt
# awk -F: '/root/{print $1,$NF}' 1.txt 
root /bin/bash
# awk -F: '/root/{print $0}' 1.txt      
root:x:0:0:root:/root:/bin/bash
# awk 'NR==1,NR==5' 1.txt 
# awk 'NR==1,NR==5{print $0}' 1.txt
# awk 'NR==1,NR==5;/^root/{print $0}' 1.txt 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

2、内置变量分隔符举例

FS和OFS:
# awk 'BEGIN{FS=":"};/^root/,/^lp/{print $1,$NF}' 1.txt
# awk -F: 'BEGIN{OFS="\t\t"};/^root/,/^lp/{print $1,$NF}' 1.txt        
root            /bin/bash
bin             /sbin/nologin
daemon          /sbin/nologin
adm             /sbin/nologin
lp              /sbin/nologin
# awk -F: 'BEGIN{OFS="@@@"};/^root/,/^lp/{print $1,$NF}' 1.txt     
root@@@/bin/bash
bin@@@/sbin/nologin
daemon@@@/sbin/nologin
adm@@@/sbin/nologin
lp@@@/sbin/nologin
[root@server shell07]# 

RS和ORS:
修改源文件前2行增加制表符和内容:
vim 1.txt
root:x:0:0:root:/root:/bin/bash hello   world
bin:x:1:1:bin:/bin:/sbin/nologin        test1   test2

# awk 'BEGIN{RS="\t"};{print $0}' 1.txt
# awk 'BEGIN{ORS="\t"};{print $0}' 1.txt

四、 awk工作原理

awk -F: '{print $1,$3}' /etc/passwd

  1. awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符(RS)结束

  2. 每行被间隔符==:==(默认为空格或制表符)分解成字段(或域),每个字段存储在已编号的变量中,从$1开始

    问:awk如何知道用空格来分隔字段的呢?

    答:因为有一个内部变量==FS==来确定字段分隔符。初始时,FS赋为空格

  3. awk使用print函数打印字段,打印出来的字段会以==空格分隔==,因为\$1,\$3之间有一个逗号。逗号比较特殊,它映射为另一个内部变量,称为==输出字段分隔符==OFS,OFS默认为空格

  4. awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕

推荐阅读:
  1. awk详解及举例
  2. AWK学习笔记

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

awk linux/unix

上一篇:Python制作字符雨(代码)

下一篇:是时候该搭建自己的私有云盘了——nextcloud 12

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》