linux系统之文本格式化工具awk

简介:

一、文本处理工具

grep、sed和awk都是文本处理工具,虽然都是文本处理工具但却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。

grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多;
sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed;

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

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

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

  • 使用变量操作数据库

  • 使用算术和字符串操作符

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

  • 生帮格式化报告

  • 定义函数

  • 从脚本中执行unix命令

  • 处理unix命令的结果

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

  • 更容易地处理多个输入流

三、语法格式

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

1、选项

-F fs or --field-separator fs:

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

#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

wKioL1NBJRmCP3i8AAHmFxB5UOc722.jpg

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

wKioL1NBJo6ggoygAADZ-2DtPuQ717.jpg

2、awk的输出:print和printf

⑴、print的使用格式:

print item1, item2, ...

要点:

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

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

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

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

实例

wKiom1NBKS_BwfM0AACZkFzCp_s795.jpg

⑵、printf的使用格式

printf format, item1, item2, ...

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

%c

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

wKiom1NBKiCgOr_tAABvKrxuDWw453.jpg

%d, %i

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

wKioL1NBKk3QABhtAAC4294mCiU316.jpg

%e, %E

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

wKioL1NBKz7j69JLAAFlB4E30yc055.jpg

%f

以浮点表示法打印数字,如 printf "%4.3f\n", 6745结果为6745.0000000

wKiom1NBLAbTiZHiAABnpSu_Rzo057.jpg

%s

打印字符串,如printf "%10s\n", 6745结果为十个空格加6745。

wKioL1NBLI3S8XyJAABP2IXbdZs195.jpg

可更改的格式:

N$

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

wKioL1NBLmigIuXEAADsYHCzwN8582.jpg

修饰符

N: 显示宽度;

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

wKiom1NBRyWjY4XlAADA52wl3YQ099.jpg

3、模式和操作

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

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

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

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

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

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

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

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

  • 变量或数组赋值

  • 输出命令

  • 内置函数

  • 控制流命令

4、变量

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

FS: field separator 读取文件本时,所使用字段分隔符
RS: Record separator 输入文本信息所使用的换行符
OFS: Output Filed Separator 输出字段分隔符(默认值是一个空格)
ORS:Output Row Separator 输出记录分隔符(默认值是一个换行符)

wKioL1NBNCzhKn2dAAHfTp_8JTE006.jpg

注:

从$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用法

wKioL1NBN1iCKEKLAAHv8FnWF1E842.jpg

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

wKiom1NBOCewuwqhAAH-50uswW4321.jpg

FNR用法

wKiom1NBOO6xV4-eAAH-1fUFdYs235.jpg

ARGV用法

wKiom1NBPEOCDyCCAAGXmCnWNTc876.jpg

之二

wKiom1NBPV-CBu10AAEFzoxinSo600.jpg

FILENAME用法

wKiom1NBPsPRXSriAANBI5SWlv4654.jpg

ENVIRON用法

wKioL1NBQifg6icPAAE1XFKBXtc198.jpg

注:

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;

实例:

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

wKiom1NBStnDFP2pAAExjxe_fhc563.jpg

6、awk的操作符:

⑴、算术操作符:
-x: 负值
+x: 转换为数值;
x^y:
x**y: 次方
x*y: 乘法
x/y:除法
x+y:
x-y:

x%y:

实例

wKiom1NBTQrCngRtAAEi3k07gnM847.jpg

⑵、字符串操作符:
只有一个,而且不用写出来,用于实现字符串连接;
⑶、 赋值操作符:
=
+=
-=
*=
/=
%=
^=
**=
++
--

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

⑷、布尔值
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.
⑺、表达式间的逻辑关系符:
&&

||

实例:

wKioL1NBTj_RLuZNAAJCgtUvxKU570.jpg

⑻、条件表达式:
selector?if-true-exp:if-false-exp
if selector; then
 if-true-exp
else
 if-false-exp
fi

实例

wKiom1NBT1PiUUJJAAFOxwjTL9A175.jpg

⑼、函数调用:

function_name(para1,para2)

7、控制语句

⑴、 if-else

语法:

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

实例:

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









本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1391320,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
Linux
Linux系统中,根目录
【7月更文挑战第14天】
12 4
|
2天前
|
Ubuntu Linux Shell
Ubuntu/linux系统环境变量配置详解
理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
10 2
|
3天前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
17 0
|
2天前
|
监控 Linux Shell
Linux系统之nice命令的基本使用
【7月更文挑战第10天】Linux系统之nice命令的基本使用
9 0
|
3天前
|
Linux C语言 C++
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
18 0
|
Linux
原来,在Linux系统也有快速格式化功能
一、问题背景 在使用mkfs格式化1TB左右容量的硬盘时发现所耗费的时间很长,简直是一种折磨。
1607 0
|
4天前
|
监控 数据挖掘 Linux
探索Linux中的`sort`命令:数据处理与分析的得力助手
`sort`命令是Linux下文本数据排序利器,用于按字典、数字顺序等对行排序。关键参数有:-n(数字排序),-r(逆序),-u(去重),-k(指定字段),-t(字段分隔符)和-o(输出到文件)。在处理大文件时注意内存使用,确保字符编码一致,灵活运用管道和重定向。通过熟练使用`sort`,能提升数据分析效率。
|
4天前
|
数据挖掘 Linux 数据处理
Linux命令sprof详解
**`sprof`是Linux下的共享库性能分析工具,补充`gprof`,专注分析`.profile`文件以识别性能瓶颈。通过调用次数、执行时间数据优化资源和代码。使用参数如`-F`、`-I`、`-d`进行定制化分析。示例:先设置`LD_PROFILE`环境变量,运行程序生成`.profile`,然后用`sprof`分析。注意需用`-g`编译程序,并在代表性的负载下分析。结合其他工具如`perf`、`valgrind`提升分析效果。**
|
4天前
|
存储 数据挖掘 Linux
Linux命令split详解:大文件处理的得力助手
`split`命令是Linux用于将大文件分割成小文件的工具,常用于日志处理、备份。它支持按行数(-l)、字节数(-b)分割,并能自定义输出文件名(-a, -d)。例如,`split -b 10M largefile.txt smallfile_`会按10MB切割`largefile.txt`,生成`smallfile_`开头的文件。注意确保磁盘空间充足,避免文件名冲突,并备份原始文件。结合其他命令使用,能提高文件管理效率。
|
21小时前
|
关系型数据库 MySQL Linux
Linux命令systemctl详解
`systemctl`是Linux系统用于管理systemd服务的核心命令,它与systemd守护进程交互,实现启动、停止、重启服务及查看服务状态等功能。主要参数包括`start`、`stop`、`restart`、`status`、`enable`和`disable`等。例如,启动Apache服务使用`systemctl start httpd.service`,查看服务状态用`systemctl status &lt;service&gt;`。使用时需注意权限,服务名通常以`.service`结尾,但命令中可省略。最佳实践包括利用tab键补全、定期查看服务状态和合理配置服务自启。