linux-shell脚本命令之awk

[ 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 > FNR

FS  输入字段分隔符(缺省为: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;6

NF  当前记录中的分段个数

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

hiahia

ORS  输出记录分隔符,缺省为换行符,控制每个print语句后的输出符号

awk ‘BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}‘ ddd.txt

[ awk内置函数: ]

blength[([s])]                计算字符串长度(byte为单位)

length[([s])]                  计算字符串长度(character为单位)

rand()                            生成随机数

srand([expr])                设置rand() seed

int(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}‘ file

7. 统计每一行分段后的段数用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 的值.

linux-shell脚本命令之awk

时间: 2024-07-28 15:06:13

linux-shell脚本命令之awk的相关文章

linux 基础 shell脚本命令

#########shell脚本命令#### 1.diff diff      file file1             ####比较两个文件的不同 -c                         ####显示周围的行 -u                         ####按照一格式统一输出生成补丁 -r                         ####比较两个文件的不同 patch       file file.path       ####打补丁 -b      

Linux Shell脚本入门--cut命令

Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [[email protected] ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符 [[email protected] ~]# cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符.与 -f 一起使用: -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思: -c :以字符 (

《Linux Shell脚本攻略》 笔记 第二章:常用命令

<Linux Shell脚本攻略> 笔记 第二章:常用命令 1.cat cat -s //多个空白行压缩成一个 cat *.txt | tr -s '\n'   //移除空白行 cat -n //加行号 2.find 沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. eg: find ./ ! -name "*.txt" -print [[email protected] program_test]# find ./  -type f -name "

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

linux shell 管道命令(pipe)使用及与shell重定向区别

linux shell 管道命令(pipe)使用及与shell重定向区别 看了前面一节:linux shell数据重定向(输入重定向与输出重定向)详细分析 估计还有一些朋友是头晕晕的,好复杂的重定向了.这次我们看下管道命令了.shell管道,可以说用法就简单多了. 管道命令操作符是:"|",它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力.然后,传递给下一个命令,作为标准的输入 st

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

linux shell 脚本获取和替换文件中特定内容

1.从一串字符串中获取特定的信息 要求1:获取本机IP:menu.lst为系统镜象的IP配置文件,需要从中获取到本机IP信息(从文件获取信息) 1 timeout 1 2 default 0 3 4 title live 5 find --set-root /casper/vmlinuz 6 kernel /casper/vmlinuz boot=casper ignore_uuid showmounts ip=eth0,10.0.66.66,255.255.240.0,10.0.64.3 7

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

老李分享:《Linux Shell脚本攻略》 要点(八)

老李分享:<Linux Shell脚本攻略> 要点(八) 1.打印进程 [[email protected] program_test]# ps -e | head  PID TTY          TIME CMD    1 ?        00:00:03 init    2 ?        00:00:00 kthreadd    3 ?        00:00:00 migration/0    4 ?        00:00:00 ksoftirqd/0    5 ?   

老李分享:《Linux Shell脚本攻略》 要点(四)

老李分享:<Linux Shell脚本攻略> 要点(四) 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2.grep用法 //在多级目录中对文本进行递归检索 [[email protected] program_test]# grep "yang" ./ -Rn ./test.txt:6:laoyang./right.txt:1:1 yang man //忽略大小写匹配 [[email protec