linux-shell脚本命令之awk

本文发布时间: 2019-Mar-22
[ 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 > FNRFS 输入字段分隔符(缺省为: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;6NF 当前记录中的分段个数 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 hiahiaORS 输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号 awk 'BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}' ddd.txt[ awk内置函数: ]blength[([s])] 计算字符串长度(byte为单位)length[([s])] 计算字符串长度(character为单位)rand() 生成随机数srand([expr]) 设置rand() seedint(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 # 输出的分隔符以 - 进行隔开6. awk在所有行处理完之后, 还可以先一些操作, 使用END 格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file7. 统计每一行分段后的段数用NF who | awk '{print NF}' 8. 获取awk处理文件内容在源文件中是第几行用NR awk -F: '/^A/{print NR}' ccc.txt # 获取以 A 开头的串在ccc.txt是第几行9. 自定义变量 awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt # 循环ccc.txt文件之前, 先定义一个变量, 初始值为0; 然后循环每一行, 每找到一行含有tb的行就给 a 加 1, 直到最后打印 a 的值.


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:10pm
栏目列表