linux 文本 时间格式化,Linux系统之文本格式化工具awk

<

div contentScore=”3711″>sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed;

awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。

二、awk可以完成的一些功能

将文本文件看做由记录和字段组成的文本数据库

使用变量操作数据库

使用算术和字符串操作符

使用普通的程序设计结构,例如循环和条件

生帮格式化报告

定义函数

从脚本中执行unix命令

处理unix命令的结果

更加巧妙的处理命令行的参数

更容易地处理多个输入流

三、语法格式

1

2

# awk [options] 'script' file1 file2, ...

# awk [options] 'PATTERN { action }' file1 file2, ..

1、选项

-F fs or –field-separator fs:

指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:

1

2

3

4

#awk -F: '/root/{print $1,$NF}' /etc/passwd

#awk -F: '/root/{print $1$NF}' /etc/passwd

#awk -F: '/root/{print $1 $NF}' /etc/passwd

#awk -F: '/root/{print $1"#"$NF}' /etc/passwd

55796ce8e12b72b00d62de1560667e7c.png

-v 选项定义的变量在脚本运行之前即存在,可以在脚本的 BEGIN 流程中被调用;

a032c0f0b006ea4e6187dfb97b4c0c0c.png

2、awk的输出:print和printf

⑴、print的使用格式:

print item1, item2, …

要点:

①、各项目之间使用逗号隔开,而输出时则以空白字符分隔;

②、输出的item可以为字符串或数值、当前记录的字段(如$1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;

③、print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print “”;

注意,在AWK中,$表示字段,用户变量不需要加$,这是AWK与shell或者Perl不同之处!在shell中,变量定义时不加$,再次引用时则需要用$,而在Perl中,无论定义和引用时都需要加$ (Perl中$表示标量,另有@和%符号表示数组和Hash变量)。

实例

f14c1768a31b1c2bcee817acec1fb01d.png

⑵、printf的使用格式

printf format, item1, item2, …

format格式的指示符都以%开头,后跟一个字符,

%c

转换数字成ASCII,如printf “%c”, 67结果为C。

676749a66cd65613957602d9b994378b.png

%d, %i

打印十进制整数,如printf “%dn”, 6.745结果为6。

d0e68433aa3eb2851accbc88e1899b9b.png

%e, %E

转换数字为科学(指数)符号,如printf “%4.3en”, 6745结果为6.745e+03。

8dfde1be9be15b2439df50f3921ecf5d.png

%f

以浮点表示法打印数字,如 printf “%4.3fn”, 6745结果为6745.0000000

d6bfc88189c01274bc341dea473f6465.png

%s

打印字符串,如printf “%10sn”, 6745结果为十个空格加6745。

8049e8748498aced331e3cbe5acf0fb3.png

可更改的格式:

N$

位置指示符,可调整字符串的输出位置。printf “%s %s %sn”, “I”, “lOVE”,”YOU”输出为:I LOVE YOU,我们调整一下位置,printf “%3$s %2$s %1$sn”, “YOU”, “LOVE”,”I”,输出结果为:I LOVE YOU

ecc4090223fe5918f551e7c531471059.png

修饰符

N: 显示宽度;

-: 左对齐;

+:右对齐(也可以显示数值符号正负之用);

66b8200184bc65841010d07a9e7da0e0.png

3、模式和操作

⑴、模式可以是以下任意一个:

/正则表达式/:使用通配符的扩展集。

关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

模式匹配表达式:用运算符~(匹配)和~!(不匹配)。

模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作。

⑵、操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:

变量或数组赋值

输出命令

内置函数

控制流命令

4、变量

⑴、awk内置变量之记录变量

FS: field separator

读取文件本时,所使用字段分隔符

RS: Record separator

输入文本信息所使用的换行符

OFS: Output Filed Separator

输出字段分隔符(默认值是一个空格)

ORS:Output Row Separator

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

dc3d7d25e31175b9e0cef418fd7b4719.png

注:

从$1,$2一直到$NF,整行用$0标,如果$0被赋予新值,所有的$1,$2…和NF都将被重新计算。同样,若$i被改变,$0将用OFS重新计算。

⑵、awk内置变量之数据变量

NR: The number of input records

awk命令所处理的记录数;如果有多个文件,这个数目会把处理的多个文件中行统一计数

NF:Number of Field

当前记录的field个数

FNR

当前文件的相对记录数

ARGV

数组,保存命令行本身这个字符串,如awk ‘{print $0}’ a.txt b.txt这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt

ARGC

awk命令的参数的个数

FILENAME

awk命令所处理的文件的名称

ENVIRON

当前shell环境变量及其值的关联数组

NR用法

0faa6766128162fe3b0c7214ab1ed0e3.png

NF用法(默认以空格分隔)

5e91911ef1473acd65a2a9f73fce882b.png

FNR用法

37c88de6b134d0f6b9fc595f6beeca0e.png

ARGV用法

e788a71851416e5275044880b018f216.png

之二

f40aad64a4627c04c87bf3fa1e446dc2.png

FILENAME用法

234010182e3737516ec8b17e75b98310.png

ENVIRON用法

b64e19eba63a1fd284b4d26eedcffeb7.png

注:

ARGV数组由ARGV[0]….ARGV[ARGC-1]组成,第一个元素是0而不是1,这与AWK中的般数组不同

ENVIROND数组在shell与AWK的交互中非常有用,使用ENVIRON[“PARA_NAME”]来获取环境变量$PARA_NAME的值,其中引号“”不可少!

5、标准输出与重定向

⑴、输出重定向

print items > output-file

print items >> output-file

print items | command

⑵、特殊文件描述符:

/dev/stdin:标准输入

/dev/sdtout: 标准输出

/dev/stderr: 错误输出

/dev/fd/N: 某特定文件描述符,如/dev/stdin就相当于/dev/fd/0;

实例:

1

2

# awk -F" " '{printf "%-15s %in",$1,$3 > "/dev/stderr" }' /etc/issue

# awk -F" " '{printf "%-15s %in",$1,$3 > "/dev/null" }' /etc/issue

39c3576db86fd85145ac339a27d9d2a2.png

6、awk的操作符:

⑴、算术操作符:

-x: 负值

+x: 转换为数值;

x^y:

x**y: 次方

x*y: 乘法

x/y:除法

x+y:

x-y:

x%y:

实例

7fa07372485e70008a0fa75d59ee7d05.png

⑵、字符串操作符:

只有一个,而且不用写出来,用于实现字符串连接;

⑶、 赋值操作符:

=

+=

-=

*=

/=

%=

^=

**=

++

需要注意的是,如果某模式为=号,此时使用/=/可能会有语法错误,应以/[=]/替代;

⑷、布尔值

awk中,任何非0值或非空字符串都为真,反之就为假;

⑸、 比较操作符:

x < y    True if x is less than y.

x <= y    True if x is less than or equal to y.

x > y    True if x is greater than y.

x >= y    True if x is greater than or equal to y.

x == y    True if x is equal to y.

x != y    True if x is not equal to y.

x ~ y    True if the string x matches the regexp denoted by y.

x !~ y    True if the string x does not match the regexp denoted by y.

subscript in array  True if the array array has an element with the subscript subscript.

⑺、表达式间的逻辑关系符:

&&

||

实例:

feb94cde17b25874ab6932b9f1074be2.png

⑻、条件表达式:

selector?if-true-exp:if-false-exp

if selector; then

if-true-exp

else

if-false-exp

fi

实例

eab60b60aca5e852d2b8c1c22462490b.png

⑼、函数调用:

function_name(para1,para2)

7、控制语句

⑴、 if-else

语法:

if (condition) {then-body} else {[ else-body ]}

实例:

1

2

3

4

#awk '{if ($3==0) {print $1, "Adminitrator";} else { print $1,"Common User"}}' /etc/passwd

#awk -F: '{if ($1=="root") print $1, "Admin"; else print $1, "Common User"}' /etc/passwd

#awk -F: '{if ($1=="root") printf "%-15s: %sn", $1,"Admin"; else printf "%-15s: %sn", $1, "Common User"}' /etc/passwd

#awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd

51026b3a748b371990b724985176e422.png

⑵、 while

语法:

while (condition){statement1; statment2; …}

实例:

1

2

3

4

#awk -F: '{i=1;while (i<=3) {print $i;i++}}' /etc/passwd

#awk -F: '{i=1;while (i<=NF) { if (length($i)>=4) {print $i}; i++ }}' /etc/passwd

#awk '{i=1;while (i<=NF) {if ($i>=20000) print $i; i++}}' random.txt

#random.txt文件的内容为一堆随机数。

6a71e9b762a7f4c360186905a28bed2a.png

⑶、do-while 至少执行一次循环体,不管条件满足与否

语法:

do {statement1, statement2, ...} while (condition)

实例:

1

2

3

4

5

6

7

8

#awk 'BEGIN{

sum=0;

i=0;

do{

sum+=i;

i++;

}while(i<=100)

printsum;}'

7a54bd0b918dddd1eeb7bf974d1ab208.png

⑷、for

语法:for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

实例:

1

#awk -F: '{for(i=1;i<=3;i++) { if (length($i)>=8) {print $i}}}' /etc/passwd

6d61e390191aed8766b0d2bd5f9ab1d5.png

for循环还可以用来遍历数组元素:

语法:

for (i in array) {statement1, statement2, ...}

实例:

1

#awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%-15s:%in",A,BASH[A]}}' /etc/passwd

8bd2df2c99a472f2ddc989b106b0d614.png

⑸、 case

语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}

⑹、 break 和 continue

常用于循环或case语句中

⑺、 next

提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:

实例:

1

# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd

f3ba7471eda7dcfd7409fa65ace8a43c.png

9、awk中使用数组

⑴、 数组

array[index-expression]

index-expression可以使用任意字符串;需要注意的是,如果某数据组元素事先不存在,那么在引用其时,awk会自动创建此元素并初始化为空串;因此,要判断某数据组中是否存在某元素,需要使用index in array的方式。

要遍历数组中的每一个元素,需要使用如下的特殊结构:

语法

for (var in array) { statement1, ... }

其中,var用于引用数组下标,而不是元素值;

实例:

1

#netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

c26c9b63f1d1a4956cc37f1e72a3438b.png

⑵、 删除数组变量

从关系数组中删除数组索引需要使用delete命令。使用格式为:

delete  array[index]

10、awk的内置函数

split(string, array [, fieldsep [, seps ] ])

功能:将string表示的字符串以fieldsep为分隔符进行分隔,并将分隔后的结果保存至array为名的数组中;数组下标为从1开始的序列;

实例:

1

2

3

# netstat -ant | awk '/:80>/{split($5,clients,":");IP[clients[1]]++}END{for(i in IP){print IP[i],i}}' | sort -rn | head -50

# netstat -tan | awk '/:80>/{split($5,clients,":");ip[clients[4]]++}END{for(a in ip) print ip[a],a}' | sort -rn | head -50

# df -lh | awk '!/^File/{split($5,percent,"%");if(percent[1]>=20){print $1}}'

cb84ed5fa2c32d8d460010765a70a0f6.png

length([string])

功能:返回string字符串中字符的个数;

substr(string, start [, length])

功能:取string字符串中的子串,从start开始,取length个;start从1开始计数;

1

# tail -10 /etc/passwd |awk -F: '{print substr($1,1,6)}'

30681b0e32e7e85b3927bc02b27d5267.png

system(command)

功能:执行系统command并将结果返回至awk命令

1

# awk 'BEGIN{print system("ls -l")}'

2bdadb903e9f4d2b04e5cf4a7197a052.png

systime()

功能:systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

d42916ca56e669a3c47b142f8df1e826.png

tolower(s)

功能:将s中的所有字母转为小写

toupper(s)

功能:将s中的所有字母转为大写

1

# awk 'BEGIN{s="acl";print toupper(s)}'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值