grep3大shell文本管理工科具之awk的使用

By admin in 美高梅手机版4858 on 2019年5月3日

壹门语言,过滤内容(擅长取列)

awk

一、awk命令

awk是一种编制程序语言,用于在linux/unix下对文本和数量举行拍卖(gawk –
pattern scanning and processing
language)。centos7中的awk是gawk的链接。它帮助用户自定义函数和动态正则表达式等先进效用,是linux/unix下的一个有力编制程序工具。前边的grep、sed只是只是的工具,而awk已经是1门语言了,可知awk的机能将相比较强硬

用法:
awk -F ‘分割暗号’ ‘script’ files
awk [options] ‘script’ var=value file(s)
awk [options] -f scriptfile var=value file(s)

选项:
-F fs fs钦点输入分隔符,fs能够是字符串或正则表明式,如-F:
-v var=value 赋值叁个用户定义变量,将表面变量传递给awk
-f scripfile 从剧本文件中读取awk命令

  -F “[, ]”  多分隔符

1、是什么
是贰个编制程序语言。协理变量、数组、函数、流程序调节制(if…else/for/while)
单行程序语言。

二、对文件竖列的操作

awk命令能够有利于的经过点名分隔暗号将文件分成特定的列,然后在针对分出去的竖列进行操作

1、呈现test.txt文书档案的率先列前5行。

awk -F ‘:’ ‘{print $1}’ test.txt | head -n 5

一声令下解释:-F ‘:’
正是说这几个文件以:作为分隔符,大家狠抓验的是passwd文件,它自个儿就被:分割成了7段,'{}’中正是操作的描述,命令中的print
$壹 正是展现第三列。

美高梅手机版4858 1

贰、展现test.txt文件全数竖列的剧情

awk -F ‘:’ ‘{print $0}’ test.txt
awk ‘{print $0}’ test.txt

留意与上一条命令的分裂,$1表示第二列,$0表示全体列。
美高梅手机版4858 2

功能上其实和cat同样。

3、awk也可以
awk命令在并未有点名-F
分割符号或分割字符串时,暗中同意以空格或许空白段作为分隔符

咱俩先创立一个测试文书档案,以空格作为分隔符
美高梅手机版4858 3

后我们输入下列命令

awk ‘{print $1}’
awk ‘{print $1,$3}’
awk ‘{print $1,$2}’

美高梅手机版4858 4

能够见到awk自动把空格作为分段旗号,不管是稍稍个空格。

4、指定#为体现分隔符显示特定列(注意不会影响原本文本,只是影响展现)

awk -F ‘:’ ‘{print $1″#”$3″#”$7}’ test.txt

美高梅手机版4858 5

  $一 第三列  $NF最终壹列

二、工作流程
读取file、标准输入、管道给的数目,从第三行早先读取,逐行读取,看是或不是相配大家想要的数额(pattern形式相配),对数据开始展览管理,直到读完全数的行,退出awk程序(实施的每一条awk的一声令下)

3、awk匹配作用举个例子

awk 搜索操作时与sed命令一样,awk暗许帮助正则,无需像grep -E , sed -r
一样要求专门选项。
一、找出含首要字root的行

awk ‘/root/’ test.txt

美高梅手机版4858 6

二、搜索第二竖列中涵盖oo字符的行。

sed -F ‘:’ ‘$1 ~/oo/’ test.txt

美高梅手机版4858 7

注意这一个波浪号~便是协作的意思。

三、找出root和test大肆相配个中多少个所在的行的第叁列和第一列

awk -F ‘:’ ‘/root/{$1,$3} /test/{$1,$3}’ test.txt
awk -F ‘:’ ‘/root|test/ {print $0}’ test.txt

美高梅手机版4858 8

美高梅手机版4858 9

四、找寻分割后第三段==0的行,也便是uid是零的行。

awk -F ‘:’ ‘$3==0’ test.txt

美高梅手机版4858 10

那壹列也足以举行到别的数学表明式

awk -F ‘:’ ‘$3>=1000’ test.txt

美高梅手机版4858 11

awk -F ‘:’ ‘$3<=100’ test.txt

美高梅手机版4858 12

伍、找出分割后最终不是/sbin/nologin的行

awk -F ‘:’ ‘$7!=”/sbin/nologin” {print $1}’ test.txt

美高梅手机版4858 13

写正则时七个注意点:一是还是不是怎么的表明式为!=,2是字符串相配时要用双引号

6、搜索第2列大于第五列也许第玖列==/sbin/nologin的行

awk -F ‘:’ ‘$3>$4||$7==”sbin/nologin”‘ test.txt

美高梅手机版4858 14

||表示仍旧,&&表示还要。

7、寻觅第三列大于第四列和第七列==/sbin/nologin的行

awk -F ‘:’ ‘$3>$4||$7&&”sbin/nologin”‘ test.txt

美高梅手机版4858 15

      awk  ‘{print $一}’文件<==$一率先列,$二回之列…$NF最后一列,$(NF-一)

3、语法
awk [-F field seperator] ‘pattern{action}’ [file]

4、awk内置变量功用举个例子

awk命令自带了有的变量:
OFS:系统一分配隔符
NEvoque:总行数变量
NF:分割后最大段数数值

1、列出第3列大于一千数字还是第7段包涵/bash/的行,打字与印刷这一个行的一、3、七段,并且用#做呈现分隔符。

awk -F ‘:’ ‘{OFS=”#”} $3>1000|| $7 ~ /bash/ {print $1,$3,$7}’
test.txt
awk -F ‘:’ ‘{OFS=”#”} {if ($3>1000|| $7 ~ /bash/){print
$1,$3,$7}}’ test.txt

美高梅手机版4858 16

美高梅手机版4858 17
grep3大shell文本管理工科具之awk的使用。二、呈现分段的最终1行

awk -F ‘:’ ‘{print $NF}’ test |head -n3

美高梅手机版4858 18
$NF 代表最后 NF表示段数,是3个数字

3、突显文件,并在每1行前增加行号==grep -n

awk -F ‘:’ {print NR”:”$0} test.txt
grep -n ” test.txt

美高梅手机版4858 19
美高梅手机版4858 20

4、展现前十行,同时复习sed写法。

awk -F’:’ ‘NR<=10 {print $0}’ test.txt
sed -n ‘1,10’p test.txt

美高梅手机版4858 21

美高梅手机版4858 22
还要复习sed写法

5、利用awk命令给$1f赋值

head -n3 test.txt| awk -F ‘:’ ‘{OFS=”:”} $1=”root”‘ test.txt

美高梅手机版4858 23

注意与head -n3 test.txt| awk -F ‘:’ ‘{OFS=”:”} $1==”root”‘
test.txt的区别
美高梅手机版4858 24

例:awk  {if(NR<31 && NR>19)
 printf$1″\n”}’test. txt

-F: 钦定元数据列(字段)分隔符
‘pattern’: 相配格局
功能:相配出来要拍卖的多寡。
一)正则表明式
[root@localhost html]# awk ‘/^J/{print}’ awk_scores.txt

5、awk数学生运动算举例

一、总结第二段的值的和

awk -F ‘:’ ‘{(tot=tot+$3)}; END {print tot}’ test.txt

美高梅手机版4858 25

    N宝马7系代表行号,&& (and)并且  \n回车换行   $0表示整行

二)关系表明式 > < >= <= == != ~ !~
[root@localhost html]# awk ‘$2>90{print}’ awk_scores.txt

awk多分隔符使用  awk -F “[, ]” ‘{print $3″
“$6}’ ianTest.txt 

三) BEGIN方式在awk程序施行后,但未曾实践拍卖动作前要做的专业(定义变量)
[root@localhost html]#美高梅手机版4858, awk ‘BEGIN{x=”abc”;print x}’

四)END情势 awk程序推行完管理动作后要做的劳作。(善后)
[root@localhost html]# awk ‘BEGIN{print “Scores report”} {print}
END{print “Over!”}’ awk_scores.txt

{action}:管理动作,针对符合相配形式的数额举办的拍卖动作
万1未有pattern,只有action,会对持有的文本行实行action的管理动作
只要未有action,唯有pattern,会打字与印刷出适合相称格局的行

管理公事方式:
[file]:
awk要拍卖的文本行(源数据),能够是别的命令的出口、管道过来的数码

4、指定awk的方式
壹)命令行情势:
2)awk脚本:
#!/usr/bin/awk -f
BEGIN{
print “Scores Report”
}

{ print } //实施命令

END{
print “Over!”
}

[root@localhost html]# chmod u+x awk.awk
[root@localhost html]# ./awk.awk awk_scores.txt

3)文件
BEGIN{
print “Scores Report”
}

{ print }

END{
print “Over!”
}

[root@localhost html]# awk -f awk.awk awk_scores.txt

5、截取
行 记录 Record
列 字段 Field
字符串 出现在行和列的交点上 鲜明哪壹行的哪1列

5.1 截取列
awk 内置变量:$n n为数字 $一 $2$三 表示第几列
[root@localhost html]# awk ‘{print $1,$2}’ awk_scores.txt

awk 内置变量:$NF 最后一列
[root@localhost html]# awk ‘{print $1,$NF}’ awk_scores.txt
[root@localhost html]# ifconfig eth0 | awk ‘NR==2{print $2}’|awk -F:
‘{print $2}’

5.2 截取行(行:NR)
1)N帕杰罗 numbers of record FNCR-V当前读到的行 N中华V==壹 FN奥迪Q7==一 都以指第二行
二)正则表达式
叁)条件表明式

放到变量:$0 awk程序当前拍卖的行
[root@localhost html]# awk ‘NR==2{print $0}’ awk_scores.txt

示例:
[root@localhost html]# awk ‘/^N/{print}’ awk_scores.txt
Nancy 89 90 73 82
[root@localhost html]# awk ‘NR==2{print}’ awk_scores.txt
Nancy 89 90 73 82
[root@localhost html]# awk ‘FNR==2{print}’ awk_scores.txt
Nancy 89 90 73 82
[root@localhost html]# awk ‘$3>=90{print}’ awk_scores.txt
John 85 92 79 87
Nancy 89 90 73 82

五.三 截取字符串 哪1行的第几列找到字符串(列:$n)

以下例子是截取第3行第陆列的数额
[root@localhost html]# df -h |awk ‘NR==2{print $5}’
49%

陆、格式化输出
print
输出截取的数量,假若出口多列,列之间用“,”隔离–>输出后,变为空格
改动输出后的列值分割符号:

[root@localhost html]# awk ‘{print $3″:”$4″:”$1}’ awk_scores.txt
//冒号供给引起来
92:79:John
90:73:Nancy
88:92:Tom
65:83:Kity
89:80:Han
76:85:Kon

7、BEGIN 

BEGIN
当中的代码在施行动作之前推行,程序运行后,当中的代码只实行叁次。设置定义变量。
变量名 对应单词 意义

列:
FS      田野同志 separator
字段分隔符(awk管理的源文本的字段分隔符,默许空格或tab)
OFS   output 田野(field) separator
输出的分隔符(暗中认可空格)

行:
RS      record separator
记录分隔符(暗中同意换行符\n)
ORS   output record separator
输出记录换行符

awk ‘BEGIN{FS=”:”}{print $壹}’ /etc/passwd
//在读取源文件时,让awk以为列的相间符为“:”
awk ‘BEGIN{FS=”:”}{print $一,$二,$三}’
/etc/passwd //输出三个列
awk ‘BEGIN{FS=”:”;OFS=”-“}{print $一,$二,$叁}’
/etc/passwd //输出时,钦定输出列的相间符为“-”
awk -F: ‘{print $1″-“$2”-“$3}’
/etc/passwd(等同)

[root@localhost html]# cat awk_scores.txt
John 85 92 79 87
Nancy 89 90 73 82

Tom 81 88 92 81
Kity 79 65 83 90
Han 92 89 80 83
Kon 88 76 85 97

打字与印刷第二行:
[root@localhost html]# awk ‘BEGIN{RS=””}NR==1{print}’ awk_scores.txt
//通过“TiguanS=”””定义行的相间符为空行

源文件:
[root@localhost html]# cat awk_contacts.txt
danny male 
china beijing
(8103)82456789

jeck male
Japan Tokyo
(8103)82456789

xi female
America Washington
(8103)82456789

danny male china beijing (8103)82456789
jeck male Japan Tokyo (8103)82456789
xi female America Washington (8103)82456789

必要输出时,每种用户占一行,仅输出用户名、性别、联系电话

[root@localhost html]# awk ‘BEGIN{RS=””;FS=”\n”}{print $1,$3}’
awk_contacts.txt
danny male (8103)82456789
jeck male (8103)82456789
xi female (8103)82456789
//解析:通过汉兰达S=””调节行的相间符为空行,再经过FS=”\n”调控字段的相间符为换行符(回车),然后打字与印刷第一列和第二列

例:vim c.txt
1
2
3
4
5

算算出第二行和第3行的和
[root@server ~]# awk ‘BEGIN{RS=””;FS=”\n”}{print $1+$3}’ c.txt
4

//解析:通过XC90S=””调节行的相间符为空行,通过CR-VS之后上述例子只好分出一行(全数数字产生壹行了),再经过FS=”\n”调节字段的相间符为换行符(回车),然后打字与印刷第3列和第三列的和

八、回头看awk的工作进程
壹)awk首推读取文件的首先行,将该行赋值给$0,暗中认可行的相间符是回车\n
二)通过空格(制表符)将行分割成多少个字段(列),并将列值赋值给$n,$一 $2$叁
三)
awk怎么样直到列分隔符?运营程序之处,有1个松手变量FS来表示字段分隔符,程序开首化FS被定义为空格、制表符
肆)print 打字与印刷(推行拍卖动作),OFS默认为空格
伍)读取下1行

 

玖、高档玩的方法
数学生运动算
正如运算
逻辑运算
变量
数组
流程序调节制 if for while (类C)

九.一 数学运算

  •  –  *  /  %   ^  **  
    注意:^号和**号都以指数运算
    [root@localhost html]# awk ‘BEGIN{print 1+1}’
    2
    [root@localhost html]# awk ‘BEGIN{print 1-1}’
    0
    [root@localhost html]# awk ‘BEGIN{print 10*2}’
    20
    [root@localhost html]# awk ‘BEGIN{print 10/2}’
    5
    [root@localhost html]# awk ‘BEGIN{print 10%2}’
    0
    [root@localhost html]# awk ‘BEGIN{print 10**2}’
    100
    [root@localhost html]# awk ‘BEGIN{print 10**3}’
    1000
    [root@localhost html]# awk ‘BEGIN{print 10^3}’
    1000
    [root@localhost html]# awk ‘BEGIN{print 2^10}’

 

[root@localhost html]# awk ‘{print $1,$2+$3+$4+$5}’ awk_scores.txt
John 343
Nancy 334
Tom 342
Kity 317
Han 344
Kon 346

玖.二 相比运算
>  <  >=  <=  ==  !=  ~  !~
awk ‘$2!=89{print}’ awk_scores.txt
awk ‘/$1~^T/{print}’ awk_scores.txt
awk ‘$1~/^T/{print}’ awk_scores.txt
awk ‘$1~/^Han/{print}’ awk_scores.txt

awk ‘$2!=92{print}’ awk_scores.txt
awk ‘$2!~92{print}’ awk_scores.txt

注意:~号表示格外正则表明式,!~表示不包容。如上最后一例是代表
“截取第贰列全部不为九2的多寡。”

玖.三 逻辑运算
与 &&
或 ||
非 !

[root@localhost html]# awk ‘$2>80 && $3>80 && $4>80 &&
$5>80{print}’ awk_scores.txt

9.4 变量
awk 命名格局 shell key=value 差异意数字早先
awk中变量假设未有没提前赋值,变量的开头值–>变量的体系(字符串和数值)
字符串 –>初始值“空”
数值 –>初始值“0”

只要定义变量即引用变量:
[root@localhost html]# awk ‘BEGIN{n=1;print n}’
1

[root@localhost html]# awk ‘BEGIN{var=”abc”;print var}’
abc

计量内存使用率:
[root@localhost html]# awk ‘NR==1{t=$2}NR==2{f=$2;print
(t-f)/t*100}’ /proc/meminfo | awk -F. ‘{print $1}’

 

9.5 数组
shell中
array=(1 2 三 四 伍) 数组的下标从0 引用echo ${array[*]}

awk中
array[n]=value 数组的下标从1开首

awk引用数组:
array[n] n表示下标

概念数组array,赋值,引用:

[root@localhost html]# awk
‘BEGIN{array[1]=10;array[2]=11;array[3]=12;print
array[1],array[2],array[3]}’
10 11 12
[root@localhost html]# vim array.awk
[root@localhost html]# awk -f array.awk
A B C
[root@localhost html]# cat array.awk
BEGIN{
array[1]=”A”
array[2]=”B”
array[3]=”C”

print array[1],array[2],array[3]
}
[root@localhost html]# awk -f array.awk
A B C

9.6 if语句
if (expression)
{
statement
}
else
{
statement
}

 

示例:

#!/bin/awk -f --->#!/usr/bin/awk -f
{
if ($2>=80)
{ print $1,"Pass"}
else
{ print $1,"Nopass"}
}

 

之决断为真正境况

#!/bin/awk -f
{
if ($2>=80)
{ print $1,"Pass"}
}

 

[root@localhost html]# awk ‘{
> if($2>=80)
> {print $1,”Pass”}
> }’ awk_scores.txt
John Pass
Nancy Pass
Tom Pass
Han Pass
Kon Pass

 

9.7 for

for循环为数组赋值

#!/bin/awk -f
BEGIN{
for(i=1;i<5;i++)
{
array[i]=i
print array[i]
}
}

 

充足运算

#!/bin/awk -f
{
sum=0
for(i=1;i<5;i++)
{
sum+=$i
}
print sum
}

 

 

while

格式:

while(表达式)

{语句}

例:

#!/bin/awk -f
BEGIN{
a=10;
b=0;
while (i<=10)
{
b=a+b;
i++;
}
print b;
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有