awk命令「建议收藏」

awk命令

大家好,又见面了,我是全栈君。

1.awk工作流程


a)先运行BEGIN。
b)读取文件。读入有/n换行符切割的一条记录
c)将记录按指定的域分隔符进行划分域
d)填充域,当中$0表示全部域。$1表示第一个域,$n表示第那个域(默认域分隔符是空白键或者tab键)
e)開始运行模式所相应的动作action
f)接着開始读入第二条记录,直到全部的记录都被读完
g)运行END操作

2.用法


awk [-F field-separator] ‘{pattern + action}’ {filenames}
1. pattern表示awk在数据中查找的内容,action表示在找到匹配内容时所运行的一系列命令。

action{}能够有多个语句,以”;”号隔开。

2. [-F域分隔符]是可选的。 filenames是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下。默认的域分隔符是空格。

3.awk内置变量


ARGC
命令行參数个数
ARGV
命令行參数排列
ENVIRON
支持队列中系统环境变量的使用
FILENAME
awk浏览的文件名称
FNR
浏览文件的记录数
FS
设置输入域分隔符,等价于命令行 -F选项
NF
浏览记录的域的个数
NR
已读的记录数
OFS
输出域分隔符
ORS
输出记录分隔符
RS
控制记录分隔符

某个文件从第n行到行尾
awk ‘{NR > n}’ filename

4.awk内置字符串函数


gsub(r,s)
在整个$0中用s替代r

gsub(r,s,t)
在整个t中用s替代r

index(s,t)
返回s中字符串t的第一位置

length(s)
返回s长度

match(s,r)
測试s是否包括匹配r的字符串

split(str,array,fs )
在fs上将s分成序列a

sprint(fmt,exp)
返回经fmt格式化后的exp

sub(r,s)
用$0中最左边最长的子串取代s

substr(s,p)    
返回字符串s中从p開始的后缀部分

substr(s,p,n)  
返回字符串s中从p開始长度为n的后缀部分


5.BEGIN和END


BEGIN表示在处理随意行之前进行的操作
END表示在全部输入行处理完后进行的处理。


6.条件语句


if (expression) {
    statement;
    statement;
    ... ...
}

if (expression) {
    statement;
} else {
    statement2;
}

if (expression) {
    statement1;
} else if (expression1) {
    statement2;
} else {
    statement3;
}

7.数组


由于awk中数组的下标能够是数字和字母,数组的下标通常被称为keyword(key)。值和keyword都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现。它们并非依照你预料的顺序显示出来的。数组和变量一样,都是在使用时自己主动创建的。awk也相同会自己主动推断其存储的是数字还是字符串。一般而言。awk中的数组用来从记录中收集信息,能够用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
root
daemon
bin
sys
sync
games
......

awk -F’\t’ ‘{ a[$1]++ }’END'{ for(j in a) print a[j],j }’ filename | sort -rn | more 

filename的内容为:
apple
banana
apple
apple
banana
pear

输出结果为:
3 apple
2 banana
1 pear


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116223.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 差模信号和共模信号彻底理解_形容理解的不全面

    差模信号和共模信号彻底理解_形容理解的不全面前言AOP英文名为AspectOrientedProgramming,意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能统一维护的一种技术。AOP是OOP的延续,是Spring框架中的一个重要内容,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通过以上定义似乎还是不能理解AOP到底是什么,下面通过一个现实中的实例来说明。先看一下传统程序的流程,比如银行系统会有一个取款流程我们可以把方框里的流程

    2022年8月11日
    7
  • 数字货币的旁观者:我们为什么说区块链商业化时机还未到来?「建议收藏」

    数字货币的旁观者:我们为什么说区块链商业化时机还未到来?

    2022年3月7日
    52
  • pandas.DataFrame()中的iloc和loc用法

    pandas.DataFrame()中的iloc和loc用法简单的说:iloc,即indexlocate用index索引进行定位,所以参数是整型,如:df.iloc[10:20,3:5]loc,则可以使用column名和index名进行定位,如:df.loc[‘image1’:‘image10’,‘age’:‘score’]实例:importnumpyasnpimportpandasaspdfrompandasimpo…

    2022年10月21日
    3
  • C语言数组——字符数组

    C语言数组——字符数组C语言目录C/C++学习资源(百度云盘链接)计算机二级资料(过级专用)C语言学习路线(从入门到实战)编写C语言程序的7个步骤和编程机制C语言基础-第一个C程序C语言基础-简单程序分析VS2019编写简单的C程序示例简单示例,VS2019调试C语言程序C语言基础-基本算法C语言基础-数据类型C语言中的输入输出函数C语言流程控制语句C语言数组——一维数组C语言数组——二维数…

    2022年7月11日
    16
  • 反转每对括号间的子串java_已知入栈序列求出栈序列

    反转每对括号间的子串java_已知入栈序列求出栈序列给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。示例 1:输入:s = “(abcd)”输出:“dcba”示例 2:输入:s = “(u(love)i)”输出:“iloveu”示例 3:输入:s = “(ed(et(oc))el)”输出:“leetcode”示例 4:输入:s = “a(bcdefghijkl(mno)p)q”输出:“apmnolkjihgfedcb

    2022年8月9日
    3
  • 面向新手的Web服务器搭建(一)——IIS的搭建[通俗易懂]

    面向新手的Web服务器搭建(一)——IIS的搭建[通俗易懂]很多童鞋说自己是做移动开发的,想挂个简单的WebAPI,可是服务器又不会搭,这样一来测试就成了问题。看看网上的教程,发现略难懂,而且大多是一个转一个,没价值,所以干脆写几篇文章讲讲简单的Web服务器怎么搭,让不太涉及Web的童鞋快速上手。

    2022年5月8日
    89

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号