编程技术分享平台

网站首页 > 技术教程 正文

搞懂linux awk的使用(linux awk $1)

xnh888 2025-07-07 23:52:14 技术教程 3 ℃ 0 评论


注意,awk后面只能用单引号, awk能执行的指令只有print,这是awk程序内部定义的!,必须要用单引号将字符串原封不动传进去

awk中所有字符串需要双引号,否则当作变量, 变量和字符串可以直接连接

 awk [选项参数] 'script' var=value file(s)brawk [选项参数] -f scriptfile var=value file(s)


 注意,选项参数里面也有, -v var=value用于自定义变量,但是放置位置有要求,brawk 'script' var1=v1 var2=v2 ...  # 后面的变量定义,使用空格隔开brawk -v var1=v2 -v var2=v2 'script' var3=v3 ...  # 前面的变量定义,用多个-v来定义

1. 引用参数 $:

$1, $2, ... 分别是第一个参数,第二个参数....., $0表示整行


2.文本分割 -F

 # 使用","分割br $ awk -F, '{print $1,$2}'   log.txt  # -F与,的空格无关紧要br # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割br $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt


例子(如果要使用完整正则,应该用'单引号而非双引号,否则经常报错)

 # 简单的过滤条件br# 过滤得到第一列为2的行并输出brawk '$1==2 {print $1}' log.txt
 # 正则br# ~表示正则开始, / /中间是模式brawk '$1 ~/app/' tst.txt # 输出第一个参数中包含app的行brbr# 模式取反brawk '$1 !~/app/' test.txtbrawk '$1 !/app/' test.txt


 cat /proc/net/snmp | grep -E "Udp: [[:digit:]]+" | awk -F ' ' '{print $6 > "1.txt"; print $7 > "2.txt"}' br# 虽然只支持print, 但是还支持linux最基本的一些操作,如重定向
 # print的使用, 每个逗号输出一个空格brprint var1, var2, ... br# 变量也可以是字符串,支持字符串的连接:brprint var1","var2, var2 # 打印逗号的方式


内建变量

变量

描述

$n

当前记录的第n个字段,字段间由FS分隔

$0

完整的输入记录

ARGC

命令行参数的数目

ARGIND

命令行中当前文件的位置(从0开始算)

ARGV

包含命令行参数的数组

CONVFMT

数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组

ERRNO

最后一个系统错误的描述

FIELDWIDTHS

字段宽度列表(用空格键分隔)

FILENAME

当前文件名

FNR

各文件分别计数的行号

FS

字段分隔符(默认是任何空格)

IGNORECASE

如果为真,则进行忽略大小写的匹配

NF

一条记录的字段的数目

NR

已经读出的记录数,就是行号,从1开始

OFMT

数字的输出格式(默认值是%.6g)

OFS

输出记录分隔符(输出换行符),输出时用指定的符号代替换行符

ORS

输出记录分隔符(默认值是一个换行符)

RLENGTH

由match函数所匹配的字符串的长度

RS

记录分隔符(默认是一个换行符)

RSTART

由match函数所匹配的字符串的第一个位置

SUBSEP

数组下标分隔符(默认值是/034)


脚本:

1. 文件方式: 可以使用比较复杂的指令

 #!/bin/awk -fbr#运行前brBEGIN {br    math = 0br    english = 0br    computer = 0br br    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"br    printf "---------------------------------------------\n"br}br#运行中br{br    math+=$3br    english+=$4br    computer+=$5br    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5br}br#运行后brEND {br    printf "---------------------------------------------\n"br    printf "  TOTAL:%10d %8d %8d \n", math, english, computerbr    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NRbr}

2. 交互方式

 # 计算文件大小brls -l *.txt | awk '{sum+=$5} END {print sum}'br# 99乘法表brseq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'


3. awk 条件语句和循环语句:

 if (condition)br    action-1brelsebr    action-2brbrif (condition)br{br    actionbr}
 for (init, condition, incre\decre)br    actionbr    brwhile (condition)br    action
 breakbrcontinuebrexit: 退出程序

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表