热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【大数据】05文本处理

1、cutLinuxcut命令用于显示每行从开头算起num1到num2的文字。语法cut[-bn][file]cut[-c][file]cut[-df][file]使用说明
1、cut

Linux cut命令用于显示每行从开头算起 num1 到 num2 的文字。

语法


cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]

使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

参数:

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
  • -c :以字符为单位进行分割。
  • -d :自定义分隔符,默认为制表符。
  • -f :与-d一起使用,指定显示哪个区域。
  • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
    范围之内,该字符将被写出;否则,该字符将被排除
  • -s:不显示没有分隔符的行

实例

当你执行who命令时,会输出类似如下的内容:

$ who
rocrocket :0 2009-01-08 11:07
rocrocket pts/0 2009-01-08 11:23 (:0.0)
rocrocket pts/1 2009-01-08 14:15 (:0.0)

如果我们想提取每一行的第3个字节,就这样:

$ who|cut -b 3
c
c
c


2、sort

Linux sort命令用于将文本文件内容加以排序。

sort可针对文本文件的内容,以行为单位来排序。

语法


sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][&#43;<起始栏位>-<结束栏位>][--help][--verison][文件]

参数说明&#xff1a;

  • -b 忽略每行前面开始出的空格字符。
  • -c 检查文件是否已经按照顺序排序。
  • -d 排序时&#xff0c;处理英文字母、数字及空格字符外&#xff0c;忽略其他的字符。
  • -f 排序时&#xff0c;将小写字母视为大写字母。
  • -i 排序时&#xff0c;除了040至176之间的ASCII字符外&#xff0c;忽略其他的字符。
  • -m 将几个排序好的文件进行合并。
  • -M 将前面3个字母依照月份的缩写进行排序。
  • -n 依照数值的大小排序。
  • -o<输出文件> 将排序后的结果存入指定的文件。
  • -r 以相反的顺序来排序。
  • -t<分隔字符> 指定排序时所用的栏位分隔字符。
  • -k&#xff1a;选择排序列
  • -u&#xff1a;合并相同行
  • &#43;<起始栏位>-<结束栏位> 以指定的栏位来排序&#xff0c;范围由起始栏位到结束栏位的前一栏位。
  • –help 显示帮助。
  • –version 显示版本信息。

实例

在使用sort命令以默认的式对文件的行进行排序&#xff0c;使用的命令如下&#xff1a;

sort testfile

sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列&#xff0c;并将结果输出到标准输出。

使用 cat命令显示testfile文件可知其原有的排序如下&#xff1a;

$ cat testfile #testfile文件原有排序
test 30
Hello 95
Linux 85

使用sort命令重排后的结果如下&#xff1a;

$ sort testfile #重排结果
Hello 95
Linux 85
test 30

[root&#64;node0001 ~]# cat sort.txt
banana 12
apple 8
orange 4
[root&#64;node0001 ~]# sort -t&#39; &#39; -k2 sort.txt
banana 12
orange 4
apple 8
[root&#64;node0001 ~]# sort -t&#39; &#39; -k2 -n sort.txt
orange 4
apple 8
banana 12
[root&#64;node0001 ~]# sort -t&#39; &#39; -k2 -nr sort.txt
banana 12
apple 8
orange 4

3、wc

Linux wc命令用于计算字数。

利用wc指令我们可以计算文件的Byte数、字数、或是列数&#xff0c;若不指定文件名称、或是所给予的文件名为”-“&#xff0c;则wc指令会从标准输入设备读取数据。

语法


wc [-clw][--help][--version][文件...]

参数&#xff1a;

  • -c或–bytes或–chars 只显示Bytes数。
  • -l或–lines 只显示列数。
  • -w或–words 只显示字数。
  • –help 在线帮助。
  • –version 显示版本信息。

实例

在默认的情况下&#xff0c;wc将计算指定文件的行数、字数&#xff0c;以及字节数。使用的命令为&#xff1a;

wc testfile

先查看testfile文件的内容&#xff0c;可以看到&#xff1a;

$ cat testfile
Linux networks are becoming more and more common, but scurity is often an overlooked
issue. Unfortunately, in today’s environment all networks are potential hacker targets,
fro0m tp-secret military research networks to small home LANs.
Linux Network Securty focuses on securing Linux in a networked environment, where the
security of the entire network needs to be considered rather than just isolated machines.
It uses a mix of theory and practicl techniques to teach administrators how to install and
use security applications, as well as how the applcations work and why they are necesary.


使用 wc统计&#xff0c;结果如下&#xff1a;


$ wc testfile # testfile文件的统计信息
3 92 598 testfile # testfile文件的行数为3、单词数92、字节数598

其中&#xff0c;3 个数字分别表示testfile文件的行数、单词数&#xff0c;以及该文件的字节数。

如果想同时统计多个文件的信息&#xff0c;例如同时统计testfile、testfile_1、testfile_2&#xff0c;可使用如下命令&#xff1a;

wc testfile testfile_1 testfile_2 #统计三个文件的信息

输出结果如下&#xff1a;

$ wc testfile testfile_1 testfile_2 #统计三个文件的信息
3 92 598 testfile #第一个文件行数为3、单词数92、字节数598
9 18 78 testfile_1 #第二个文件的行数为9、单词数18、字节数78
3 6 32 testfile_2 #第三个文件的行数为3、单词数6、字节数32
15 116 708 总用量 #三个文件总共的行数为15、单词数116、字节数708

我们可以注意到&#xff0c;每次使用 wc 命令统计文件信息之后&#xff0c;会打印文件名&#xff0c;我们可能有的时候需要将wc统计的内容赋值给变量又不希望带上文件名&#xff0c;就可以使用 cat 组合一下&#xff1a;

$ cat testfile | wc # testfile文件的统计信息
3 92 598 # testfile文件的行数为3、单词数92、字节数598


4、sed

Linux sed命令是利用script来处理文本文件。

sed可依照script的指令&#xff0c;来处理、编辑文本文件。

Sed主要用来自动编辑一个或多个文件&#xff1b;简化对文件的反复操作&#xff1b;编写转换程序等。

语法


sed [options] &#39;AddressCommand&#39; file ...

参数[options] 说明&#xff1a;

  • -n: 静默模式&#xff0c;不再默认显示模式空间中的内容
  • -i: 直接修改原文件
  • -e SCRIPT -e SCRIPT:可以同时执行多个脚本
  • -f /PATH/TO/SED_SCRIPT
  • -r: 表示使用扩展正则表达式

Command&#xff1a;

  • d: 删除符合条件的&#xff1b;
  • p: 显示符合条件的行。通常 p 会与参数 sed -n 一起运行&#xff5e;&#xff1b;
  • a \string: 在指定的行后面追加新&#xff0c;内容为string
  •   \n&#xff1a;可以用于换行
  • i \string: 在指定的行前面添加新&#xff0c;内容为string
  • r FILE: 将指定的文件的内容添加至符合条件的行处
  • w FILE: 将地址指定的范围内的行另存至指定的文件中;
  • s/pattern/string/修饰符: 查找并替换&#xff0c;默认只替换每行中第一次被模式匹配到的字符串
  • g: 行内全局替换
  • i: 忽略字符大小写
  • s///: s###, s&#64;&#64;&#64; 
  •  \(\), \1, \2

实例

在testfile文件的第四行后添加一行&#xff0c;并将结果输出到标准输出&#xff0c;在命令行提示符下输入如下命令&#xff1a;

sed -e 4a\newLine testfile

首先查看testfile中的内容如下&#xff1a;

$ cat testfile #查看testfile 中的内容
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test

使用sed命令后&#xff0c;输出结果如下&#xff1a;

$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串
HELLO LINUX! #testfile文件原有的内容
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline


以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号&#xff0c;同时&#xff0c;请将第 2~5 行删除&#xff01;

[root&#64;www ~]# nl /etc/passwd | sed &#39;2,5d&#39;
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....

sed 的动作为 ‘2,5d’ &#xff0c;那个 d 就是删除&#xff01;因为 2-5 行给他删除了&#xff0c;所以显示的数据就没有 2-5 行罗&#xff5e; 另外&#xff0c;注意一下&#xff0c;原本应该是要下达 sed -e 才对&#xff0c;没有 -e 也行啦&#xff01;同时也要注意的是&#xff0c; sed 后面接的动作&#xff0c;请务必以 ” 两个单引号括住喔&#xff01;

只要删除第 2 行

nl /etc/passwd | sed &#39;2d&#39;

要删除第 3 到最后一行

nl /etc/passwd | sed &#39;3,$d&#39;

在第二行后(亦即是加在第三行)加上 drink tea 字样&#xff01;

[root&#64;www ~]# nl /etc/passwd | sed &#39;2a drink tea&#39;
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

那如果是要在第二行前

nl /etc/passwd | sed &#39;2i drink tea&#39;

如果是要增加两行以上&#xff0c;在第二行后面加入两行字&#xff0c;例如 Drink tea or ….. 与 drink beer? 

[root&#64;www ~]# nl /etc/passwd | sed &#39;2a Drink tea or ......\
> drink beer ?&#39;
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔&#xff01;所以&#xff0c;上面的例子中&#xff0c;我们可以发现在第一行的最后面就有 \ 存在。

以行为单位的替换与显示

将第2-5行的内容取代成为『No 2-5 number』呢&#xff1f;

[root&#64;www ~]# nl /etc/passwd | sed &#39;2,5c No 2-5 number&#39;
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....

透过这个方法我们就能够将数据整行取代了&#xff01;

仅列出 /etc/passwd 文件内的第 5-7 行

[root&#64;www ~]# nl /etc/passwd | sed -n &#39;5,7p&#39;
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


可以透过这个 sed 的以行为单位的显示功能&#xff0c; 就能够将某一个文件内的某些行号选择出来显示。


数据的搜寻并显示


搜索 /etc/passwd有root关键字的行



nl /etc/passwd | sed &#39;/root/p&#39;
1 root:x:0:0:root:/root:/bin/bash
1 root:x:0:0:root:/root:/bin/bash
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin:x:2:2:bin:/bin:/bin/sh
4 sys:x:3:3:sys:/dev:/bin/sh
5 sync:x:4:65534:sync:/bin:/bin/sync
....下面忽略

如果root找到&#xff0c;除了输出所有行&#xff0c;还会输出匹配行。

使用-n的时候将只打印包含模板的行。

nl /etc/passwd | sed -n &#39;/root/p&#39;
1 root:x:0:0:root:/root:/bin/bash


数据的搜寻并删除

删除/etc/passwd所有包含root的行&#xff0c;其他行输出

nl /etc/passwd | sed &#39;/root/d&#39;
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin:x:2:2:bin:/bin:/bin/sh
....下面忽略
#第一行的匹配root已经删除了


数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行&#xff0c;执行后面花括号中的一组命令&#xff0c;每个命令之间用分号分隔&#xff0c;这里把bash替换为blueshell&#xff0c;再输出这行&#xff1a;

nl /etc/passwd | sed -n &#39;/bash/{s/bash/blueshell/;p;q}&#39;
1 root:x:0:0:root:/root:/bin/blueshell

最后的q是退出。

数据的搜寻并替换

除了整行的处理模式之外&#xff0c; sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似&#xff01;他有点像这样&#xff1a;

sed &#39;s/要被取代的字串/新的字串/g&#39;

先观察原始信息&#xff0c;利用 /sbin/ifconfig 查询 IP

[root&#64;www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

[root&#64;www ~]# /sbin/ifconfig eth0 | grep &#39;inet addr&#39; | sed &#39;s/^.*addr://g&#39;
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分&#xff0c;亦即&#xff1a; 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

[root&#64;www ~]# /sbin/ifconfig eth0 | grep &#39;inet addr&#39; | sed &#39;s/^.*addr://g&#39; | sed &#39;s/Bcast.*$//g&#39;
192.168.1.100


多点编辑

一条sed命令&#xff0c;删除/etc/passwd第三行到末尾的数据&#xff0c;并把bash替换为blueshell

nl /etc/passwd | sed -e &#39;3,$d&#39; -e &#39;s/bash/blueshell/&#39;
1 root:x:0:0:root:/root:/bin/blueshell
2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑&#xff0c;第一个编辑命令删除/etc/passwd第三行到末尾的数据&#xff0c;第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容&#xff0c;不必使用管道命令或数据流重导向&#xff01; 不过&#xff0c;由於这个动作会直接修改到原始的文件&#xff0c;所以请你千万不要随便拿系统配置来测试&#xff01; 我们还是使用下载的 regular_express.txt 文件来测试看看吧&#xff01;

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

[root&#64;www ~]# sed -i &#39;s/\.$/\!/g&#39; regular_express.txt

利用 sed 直接在 regular_express.txt 最后一行加入『# This is a test』

[root&#64;www ~]# sed -i &#39;$a # This is a test&#39; regular_express.txt

由於 $ 代表的是最后一行&#xff0c;而 a 的动作是新增&#xff0c;因此该文件最后新增『# This is a test』&#xff01;

sed 的『 -i 』选项可以直接修改文件内容&#xff0c;这功能非常有帮助&#xff01;举例来说&#xff0c;如果你有一个 100 万行的文件&#xff0c;你要在第 100 行加某些文字&#xff0c;此时使用 vim 可能会疯掉&#xff01;因为文件太大了&#xff01;那怎办&#xff1f;就利用 sed 啊&#xff01;透过 sed 直接修改/取代的功能&#xff0c;你甚至不需要使用 vim 去修订&#xff01;

5、awk

AWK是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。

相对于grep的查找&#xff0c;sed的编辑&#xff0c;awk在其对数据分析并生成报告时&#xff0c;显得尤为强大。

简单来说awk就是把文件逐行的读入&#xff0c;&#xff08;空格&#xff0c;制表符&#xff09;为默认分隔符将每行切片&#xff0c;切开的部分再进行各种分析处理。

之所以叫AWK是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。

语法


awk [选项参数] &#39;script&#39; var&#61;value file(s)

awk [选项参数] -f scriptfile var&#61;value file(s)

选项参数说明&#xff1a;

  • -F fs or –field-separator fs
    指定输入文件折分隔符&#xff0c;fs是一个字符串或者是一个正则表达式&#xff0c;如-F:。
  • -v var&#61;value or –asign var&#61;value
    赋值一个用户定义变量。
  • -f scripfile or –file scriptfile
    从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
    对nnn值设置内在限制&#xff0c;-mf选项限制分配给nnn的最大块数目&#xff1b;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能&#xff0c;在标准awk中不适用。
  • -W compact or –compat, -W traditional or –traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样&#xff0c;所有的awk扩展都被忽略。
  • -W copyleft or –copyleft, -W copyright or –copyright
    打印简短的版权信息。
  • -W help or –help, -W usage or –usage
    打印全部awk选项和每个选项的简短说明。
  • -W lint or –lint
    打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or –lint-old
    打印关于不能向传统unix平台移植的结构的警告。
  • -W posix
    打开兼容模式。但有以下限制&#xff0c;不识别&#xff1a;/x、函数关键字、func、换码序列以及当fs是一个空格时&#xff0c;将新行作为一个域分隔符&#xff1b;操作符**和**&#61;不能代替^和^&#61;&#xff1b;fflush无效。
  • -W re-interval or –re-inerval
    允许间隔正则表达式的使用&#xff0c;参考(grep中的Posix字符类)&#xff0c;如括号表达式[[:alpha:]]。
  • -W source program-text or –source program-text
    使用program-text作为源代码&#xff0c;可与-f命令混用。
  • -W version or –version
    打印bug报告信息的版本。



基本用法

log.txt文本内容如下&#xff1a;

2 this is a test
3 Are you like awk
This&#39;s a test
10 There are orange,apple,mongo

用法一&#xff1a;

awk &#39;{[pattern] action}&#39; {filenames} # 行匹配语句 awk &#39;&#39; 只能用单引号

实例&#xff1a;

# 每行按空格或TAB分割&#xff0c;输出文本中的1、4项$ awk &#39;{print $1,$4}&#39; log.txt---------------------------------------------2 a3 likeThis&#39;s10 orange,apple,mongo# 格式化输出$ awk &#39;{printf "%-8s %-10s\n",$1,$4}&#39; log.txt---------------------------------------------2 a3 likeThis&#39;s10 orange,apple,mongo

用法二&#xff1a;

awk -F #-F相当于内置变量FS, 指定分割字符

实例&#xff1a;

# 使用","分割$ awk -F, &#39;{print $1,$2}&#39; log.txt---------------------------------------------2 this is a test3 Are you like awkThis&#39;s a test10 There are orange apple# 或者使用内建变量$ awk &#39;BEGIN{FS&#61;","} {print $1,$2}&#39; log.txt---------------------------------------------2 this is a test3 Are you like awkThis&#39;s a test10 There are orange apple# 使用多个分隔符.先使用空格分割&#xff0c;然后对分割结果再使用","分割$ awk -F &#39;[ ,]&#39; &#39;{print $1,$2,$5}&#39; log.txt---------------------------------------------2 this test3 Are awkThis&#39;s a10 There apple

用法三&#xff1a;

awk -v # 设置变量

实例&#xff1a;

$ awk -va&#61;1 &#39;{print $1,$1&#43;a}&#39; log.txt---------------------------------------------2 33 4This&#39;s 110 11$ awk -va&#61;1 -vb&#61;s &#39;{print $1,$1&#43;a,$1b}&#39; log.txt---------------------------------------------2 3 2s3 4 3sThis&#39;s 1 This&#39;ss10 11 10s

用法四&#xff1a;

awk -f {awk脚本} {文件名}

实例&#xff1a;

$ awk -f cal.awk log.txt




运算符


运算符描述
&#61; &#43;&#61; -&#61; *&#61; /&#61; %&#61; ^&#61; **&#61;赋值
?:C条件表达式
||逻辑或
&&逻辑与
~ ~!匹配正则表达式和不匹配正则表达式
<<&#61; > >&#61; !&#61; &#61;&#61;关系运算符
空格连接
&#43; –加&#xff0c;减
* / %乘&#xff0c;除与求余
&#43; – !一元加&#xff0c;减和逻辑非
^ ***求幂
&#43;&#43; —增加或减少&#xff0c;作为前缀或后缀
$字段引用
in数组成员

过滤第一列大于2的行

$ awk &#39;$1>2&#39; log.txt #命令
#输出
3 Are you like awk
This&#39;s a test
10 There are orange,apple,mongo

过滤第一列等于2的行

$ awk &#39;$1&#61;&#61;2 {print $1,$3}&#39; log.txt #命令
#输出
2 is

过滤第一列大于2并且第二列等于’Are’的行

$ awk &#39;$1>2 && $2&#61;&#61;"Are" {print $1,$2,$3}&#39; log.txt #命令
#输出
3 Are you




内建变量


变量描述
\$n当前记录的第n个字段&#xff0c;字段间由FS分隔
\$0完整的输入记录
ARGC命令行参数的数目
ARGIND命令行中当前文件的位置(从0开始算)
ARGV包含命令行参数的数组
CONVFMT数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO最后一个系统错误的描述
FIELDWIDTHS字段宽度列表(用空格键分隔)
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
IGNORECASE如果为真&#xff0c;则进行忽略大小写的匹配
NF输入字段分割符
NR已经读出的记录数&#xff0c;就是行号&#xff0c;从1开始
OFMT数字的输出格式(默认值是%.6g)
OFS输出记录分隔符&#xff08;输出换行符&#xff09;&#xff0c;输出时用指定的符号代替换行符
ORS输出记录分隔符(默认值是一个换行符)
RLENGTH由match函数所匹配的字符串的长度
RS记录分隔符(默认是一个换行符)
RSTART由match函数所匹配的字符串的第一个位置
SUBSEP数组下标分隔符(默认值是/034)

$ awk &#39;BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}&#39; log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 5 1
log.txt 2 2 5 2
log.txt 2 3 3 3
log.txt 2 4 4 4
$ awk -F\&#39; &#39;BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}&#39; log.txt
FILENAME ARGC FNR FS NF NR OFS ORS RS
---------------------------------------------
log.txt 2 1 &#39; 1 1
log.txt 2 2 &#39; 1 2
log.txt 2 3 &#39; 2 3
log.txt 2 4 &#39; 1 4
# 输出顺序号 NR, 匹配文本行号
$ awk &#39;{print NR,FNR,$1,$2,$3}&#39; log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This&#39;s a test
4 4 10 There are
# 指定输出分割符
$ awk &#39;{print $1,$2,$5}&#39; OFS&#61;" $ " log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This&#39;s $ a $
10 $ There $




使用正则&#xff0c;字符串匹配


# 输出第二列包含 "th"&#xff0c;并打印第二列与第四列
$ awk &#39;$2 ~ /th/ {print $2,$4}&#39; log.txt
---------------------------------------------
this a

~ 表示模式开始。// 中是模式。

# 输出包含"re" 的行
$ awk &#39;/re/ &#39; log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo




忽略大小写


$ awk &#39;BEGIN{IGNORECASE&#61;1} /this/&#39; log.txt
---------------------------------------------
2 this is a test
This&#39;s a test




模式取反


$ awk &#39;$2 !~ /th/ {print $2,$4}&#39; log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo
$ awk &#39;!/th/ {print $2,$4}&#39; log.txt
---------------------------------------------
Are like
a
There orange,apple,mongo




awk脚本

关于awk脚本&#xff0c;我们需要注意两个关键词BEGIN和END。

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

假设有这么一个文件&#xff08;学生成绩表&#xff09;&#xff1a;

$ cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62

我们的awk脚本如下&#xff1a;

$ cat cal.awk
#!/bin/awk -f
#运行前
BEGIN {math &#61; 0english &#61; 0computer &#61; 0printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"printf "---------------------------------------------\n"
}
#运行中
{math&#43;&#61;$3english&#43;&#61;$4computer&#43;&#61;$5printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3&#43;$4&#43;$5
}
#运行后
END {printf "---------------------------------------------\n"printf " TOTAL:%10d %8d %8d \n", math, english, computerprintf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}

我们来看一下执行结果&#xff1a;

$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00




另外一些实例

AWK的hello world程序为&#xff1a;

BEGIN { print "Hello, world!" }

计算文件大小

$ ls -l *.txt | awk &#39;{sum&#43;&#61;$6} END {print sum}&#39;
--------------------------------------------------
666581

从文件中找出长度大于80的行

awk &#39;lengh>80&#39; log.txt

打印九九乘法表

seq 9 | sed &#39;H;g&#39; | awk -v RS&#61;&#39;&#39; &#39;{for(i&#61;1;i<&#61;NF;i&#43;&#43;)printf("%dx%d&#61;%d%s", i, NR, i*NR, i&#61;&#61;NR?"\n":"\t")}&#39;

统计报表&#xff1a;合计每人1月工资&#xff0c;0&#xff1a;manager&#xff0c;1&#xff1a;worker

文件内容如下&#xff1a;

[root&#64;node0001 ~]# cat awk_label.txt 
Tom  0  2012-12-11  car  3000
John  1  2013-01-13  bike  1000
Vivi  1 2013-01-18  car  2800
Tom  0  2013-01-20  car  2500
John  1  2013-01-28  bike  3500

处理结果&#xff1a;

[root&#64;node0001 ~]# awk   &#39;{split($3,date,"-");if(date[2]&#61;&#61;"01"){name[
$1]&#43;&#61;$5;if($2&#61;&#61;"0"){role[$1]&#61;"M"}else{role[$1]&#61;"W"}}} END{for(i in name){print i "\t" name[i]"\t" role[i]}}&#39; awk_label.txt

Tom    2500    M
John    4500    W
Vivi    2800    W
 

更多详细内容可以查看 AWK 官方手册&#xff1a;http://www.gnu.org/software/gawk/manual/gawk.

awk、sed、grep更适合的方向&#xff1a;

  •  grep 更适合单纯的查找或匹配文本
  •  sed 更适合编辑匹配到的文本
  •  awk 更适合格式化文本&#xff0c;对文本进行较复杂格式处理

关于awk内建变量个人见解&#xff0c;简单易懂

解释一下变量&#xff1a;

变量&#xff1a;分为内置变量和自定义变量;输入分隔符FS和输出分隔符OFS都属于内置变量。

内置变量就是awk预定义好的、内置在awk内部的变量&#xff0c;而自定义变量就是用户定义的变量。

  •  FS&#xff1a;输入字段分隔符&#xff0c; 默认为空白字符
  •  OFS&#xff1a;输出字段分隔符&#xff0c; 默认为空白字符
  •  RS&#xff1a;输入记录分隔符(输入换行符)&#xff0c; 指定输入时的换行符
  •  ORS&#xff1a;输出记录分隔符&#xff08;输出换行符&#xff09;&#xff0c;输出时用指定符号代替换行符
  •  NF&#xff1a;当前行的字段的个数(即当前行被分割成了几列)
  •  NR&#xff1a;行号&#xff0c;当前处理的文本行的行号。
  •  FNR&#xff1a;各文件分别计数的行号
  •  ARGC&#xff1a;命令行参数的个数
  •  ARGV&#xff1a;数组&#xff0c;保存的是命令行所给定的各参数

自定义变量的方法

  •  方法一&#xff1a;-v varname&#61;value &#xff0c;变量名区分字符大小写。
  •  方法二&#xff1a;在program中直接定义。

 

 

 

 

 

 

 

 

 

 

 

 

 


推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
author-avatar
mobiledu2502878157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有