awk入门部分
awk不仅仅是linux系统中的一个命令,而且还是一种编程语言,可以用来处理数据和生成excel表格。处理的数据可以是一个或多个文件,可以是标注输入,也可以通过管道符获取标准输入。
awk -F:指定awk按照什么样的标准进行文本切割,切割成一列一列的。如果不知道-F参数,awk默认按照空格进行文本切割。
{}中的print代表输出的意思,
$代表取列的意思,$1就是取第一列,以此类推,
$0默认输出所有内容,
$NF默认取每一行的最后一列。
(1)awk '条件' 文件名
例:awk '{print $1}' yunjisuan.txt
(2)awk -F "分隔符号" '条件' 文件名
例:awk -F ":" '{print $1}' yunjisuan.txt
(3)awk [options] 'pattern {action}' file
[options]:参数(如:-F)
pattern:模式,模式就是条件,内容的查找范围,具有过滤作用,如果没有模式,默认输出某一列的所有内容。
{action}:动作,动作是要干什么,针对过滤出的内容,如果没有动作,默认全部输出。
例:awk -F ":" 'NR==3{print $1}' yunjisuan.txt
分析:awk -F "[:/]+" 'NR==3{print $1}' yunjisuan.txt中"[:/]+"的含义:
(1)"[:/]":表示":"和"/"都作为分隔符,分割时遇到":"和"/"都进行分割。
(2)"[:/]+":"+"表示贪婪,也就是":"和"/"连在一起表示一个分隔符,即":/",而"[:/]+"中所含有的分隔符为":"、"/"、":/"这三个分隔符,分割时遇到这三个分隔符都进行分割。 awk -F 参数 'BEGIN{}模式{动作}ECD{}' 文件名
BEGIN模块:告诉awk,数据要如何读。 ECD模块:告诉awk程序要如何结束。
NR这个符号的真的含义不是行号,而是数据被awk读取一段以后,NR就会记录一次。由于awk默认以 作为每次读数据的结束标志,因此NR就恰好等于行号了。
默认awk读入换行符和输出换行符都是 。
我们可以通过BEGIN模块,再awk读取数据之前设定它的读入换行符是什么,也就是修改awk默认的读数据时的默认换行符。(RS:读入换行符,ORS:输出换行符)
awk 'BEGIN{RS=":";ORS="|"}{print $1}' yunjisuan.txt
sort:排序,默认按照26个英文字母从a到z排序
sort -n:按数字排序
sort -rn:逆转排序,数字按从大到小排序
sort -k:指定第几列进行排序,如sort -k2,第二列进行排序
uinq:去重,去掉重复的,字母不区分大小写
uniq -c:去重计数
tr:代替
例:(1)echo "1:2:3:4:5" | tr ":" "+"
(2)1+2+3+4+5
按照单词出现频率进行降序排序(计算文件中每个单词重复数量)
sed -r '1,10s#[^a-zA-Z]+# #g' /etc/passwd>/server/files/count.txt
awk进阶部分
awk的几种模式
(1)正则表达式模式
(2)比较表达式模式
(3)范围模式
(4)特殊模式BEGIN和END
正则表达式模式:"~":表示进行正则匹配 awk '$5~/^r/' test
"!~":表示取反,用于表达与~相反的意思。
比较表达式模式:例:awk 'NR>=23&&nr<==30' /etc/services
范围模式:例:awk 'NR==2,NR==5{prnt NR,$o}' count.txt
BEGIN和END模式:awk -F ":" 'BEGIN{我是开头}{print $0}END{我是结尾}' test
awk里变量都可以赋值,变量的初始值都是0。
awk 'BEGIN{a=2;b=3;print a+b}'
"/"代表除,"*"代表乘,"**"代表乘方,
计算文件内的行数:awk '{i=i+1}END{print i}' test 其中i=i+1等于i=++
计算文件内所有数字之和:awk '{i=i+$0}END{print i}' 文件名或文件路径
计算文件内所有数字之积:awk '{BEGIN{i+1}i=i*$1}END{print i}' 文件名或文件路径
awk数组的应用
awk 'BEGIN{h[10]="lx";h[11]="HS";h[12]="IZ";h[13]="hushi"; for(i in h) print i}'
for:循环 i:变量
in:在哪取值 h:数组
转载于:https://www.cnblogs.com/mhqy/p/9871471.html