1.Linux高级命令
该章节的所有操作都在/export/data/shell目录进行,请提前创建该目录.
mkdir -p /export/data/shell/
重定向
命令 | 含义 |
---|---|
ll / > test.txt | 将/目录下文件的详情保存到test.txt文件中 |
cat 1.txt >> test.txt | 将整个文件的内容追加到上一个案例的test.txt文件中 |
cut命令
cut:文件内容查看命令,cut命令可以从一个文本文件或者文本流中提取文本列。
参数 | 解释 |
---|---|
-b | 按字节选取 忽略多字节字符边界 |
-c | 仅显示行中指定范围的字符 |
-d | 自定义分隔符,默认为制表符 |
-f | 与-d一起使用,指定显示哪个区域。 |
-n | 与“-b”选项连用,不分割多字节字符; |
–complement | 补足被选择的字节、字符或字段; |
–out-delimiter=<字段分隔符> | 指定输出内容是的字段分割符; |
–help | 显示指令的帮助信息; |
–version | 显示指令的版本信息。 |
实例:
如有一个学生报表信息文件stu.txt,包含id、name、age、score.
id name age score
01 tom 18 78
02 jack 20 85
03 bill 16 90
04 mary 24 77
05 anna 21 85
- 使用-d和-f显示文件中的指定的列
#显示id列
[root@node1 shell]# cut -d " " -f 1 stu.txt
id
01
02
03
04
05
#显示name和age列
[root@node1 shell]# cut -d " " -f 2,3 stu.txt
name age
tom 18
jack 20
bill 16
mary 24
anna 21
解释:
-d “ ” :用来指定文件字段之间的分隔符,如果文件的分隔符是制表符则不需要指定该参数
-f 数字 :用来指定哪一列
2. --complement 选项提取指定字段之外的列(打印除了第二列之外的列)
[root@node1 shell]# cut -d " " -f 2 --complement stu.txt
id age score
01 18 78
02 20 85
03 16 90
04 24 77
05 21 85
- 指定字段的字符或者字节范围
cut命令可以将一串字符作为列来显示,字符字段的记法:
N-:从第N个字节、字符、字段到结尾;
N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
-M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。
#打印第1个到第3个字符:
[root@node1 shell]# cut -c 1-4 stu.txt
id n
01 t
02 j
03 b
04 m
05 a
#打印前2个字符:
[root@node1 shell]# cut -c -2 stu.txt
id
01
02
03
04
05
#打印从第5个字符开始到结尾
[root@node1 shell]# cut -c 5- stu.txt
ame age score
om 18 78
ack 20 85
ill 16 90
ary 24 77
nna 21 85
wc命令
wc命令:统计行数 单词数 字节数
在默认的情况下,wc将计算指定文件的行数、字数以及字节数。
命令使用格式为:
wc 文件名
参数 | 解释 |
---|---|
-l | 统计行数 |
-c | 统计字节数 |
-w | 统计单词数 |
-m | 统计字符数 |
实例:
有个文件test_wc.txt,内容如下:
1 11
222 bbb
333 aaa bbb
444 aaa bbb ccc
555 aaa bbb ccc ddd
666 aaa bbb ccc ddd eee
- 统计指定文件行数、字数、字节数
[root@node1 shell]# wc test_wc.txt
6 21 85 test_wc.txt
#01.txt文件: 行数为6, 单词数为21, 字节数为85
- 查看根目录下有多少个文件
[root@node1 shell]# ls / | wc -w
24
awk命令
简介
awk是一种处理文本文件的命令,是一个强大的文本分析工具,它支持分段,默认每行按空格或TAB分割。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
语法:
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-F 指定输入文件的分隔符
-v var=value or --asign var=value 赋值一个用户定义变量。
-f scripfile or --file scriptfile 从脚本文件中读取awk命令。
运行方式:
- 命令行方式
awk [-F field-separator] ‘commands’ input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
- 脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk。
变量分配:
默认情况下,awk 会将如下变量分配给它在文本行中发现的数据字段:
- $0 代表整个文本行;
- $1 代表文本行中的第 1 个数据字段;
- $2 代表文本行中的第 2 个数据字段;
- $n 代表文本行中的第 n 个数据字段。
print和printf
awk中同时提供了print和printf两种打印输出的函数。
其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
入门案例
默认每行按空格或TAB分割,使用$n来获取段号
有个文件test_awk.txt,内容如下:
aa 111 333
bbb 444 555
ccc 666 777 888
ddd 999 222 999
案例1: 打印test_awk.txt第1段
awk '{print $1}' test_awk.txt
案例2: 打印出test_awk.txt的第1,2,3段
awk '{print $1,$2,$3}' test_awk.txt
案例3:打印出1.txt的第1,2,3段,并且使用#号连接
awk '{print $1"#"$2"#"$3}' test_awk.txt
OFS用来指定输出记录分隔符
案例1::打印1,2,3段,指定#为连接符
awk '{OFS="#"}{print $1,$2,$3}' test_awk.txt
-F 来指定分隔符
准备工作,现在有个文件test_awk2.txt,内容如下:
aaa:111:333
bbb:444:555
ccc:666:777:888
ddd:999:222:999:cccc
案例1: 打印出test_awk2.txt的所有段
awk -F ':' '{print $0}' test_awk2.txt
案例2: 打印出test_awk2.txt的第1,3段
awk -F ':' '{print $1,$3}' test_awk2.txt
内容匹配
这里的内容匹配需要使用正则表达式,常用的正则表达式规则如下:
1. ^linux 以linux开头的行
2 . $php 以php结尾的行
3. . 匹配任意单字符
4. .+ 匹配任意多个字符
5. .* 匹配0个或多个字符(可有可无)
6. [0-9a-z] 匹配中括号内任意一个字符
7. (linux)+ 出现多次Linux单词
8. (web){2} web出现两次以上
9. \
屏蔽转义
实例:
案例1: 匹配test_awk2.txt中包含cc的内容
awk '/cc/' test_awk2.txt
案例2: 匹配test_awk2.txt中第1段包含cc的内容
awk -F ':' '$1 ~ /cc/' test_awk2.txt
案例3: 匹配test_awk2.txt中第1段包含至少连续两个c的内容
awk -F ':' '$1 ~ /cc+/' test_awk2.txt
案例4: 在test_awk2.txt中如果匹配到abc就打印第1,3段,如果匹配到ccc,就打印第1,3,4段
awk -F ':' '/aaa/ {print $1,$3} /ccc/ {print $1,$3,$4}' test_awk2.txt
案例4: 在test_awk2.txt中如果匹配到aaa或者ddd,就打印全部内容
awk -F ':' '/aaa|ddd/ {print $0}' test_awk2.txt
段内容判断
在awk命令中,支持很多运算符,使用这些运算符可以进行段内容判断
运算符 | 解释 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ – | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
案例1:在test_awk2.txt中如果第3段等于222就打印所有内容
awk -F ':' '$3==222 {print $0}' test_awk2.txt
案例2:在test_awk2.txt中如果第3段等于333就打印第一段
awk -F ':' '$3==333 {print $1}' test_awk2.txt
案例3:在test_awk2.txt中如果第3段等于300就打印第一段
awk -F ':' '$3==333 {print $1}' test_awk2.txt
案例4:在test_awk2.txt中如果第1段等于ccc,并且第2段匹配666就打印全部
awk -F ':' '$1=="ccc" && $2==666 {print $0}' test_awk2.txt
段之间的比较
案例1:在test_awk2.txt中如果第3段小于第4段就打印全部
awk -F ':' '$3<$4 {print $0}' test_awk2.txt
案例2:在test_awk2.txt中如果第2段等于第4段就打印全部
awk -F ':' '$2==$4 {print $0}' test_awk2.txt
NR行号和NF段数
NF 一条记录的字段的数目(多个字段)
NR 已经读出的记录数,就是行号,从1开始(加个行号)
案例1:打印test_awk2.txt全部内容显示行号
awk -F ':' '{print NR " : " $0}' test_awk2.txt
案例2:打印test_awk2.txt全部内容显示段数
awk -F ':' '{print NF " : " $0}' test_awk2.txt
案例3:打印test_awk2.txt前2行,并显示行号 (用二种不同的方式实现)
nl命令在linux系统中用来计算文件中行号
nl test_awk2.txt | head -2
awk -F ':' 'NR<=2 {print NR " " $0}' test_awk2.txt
综合案例
案例1: 对统计awk目录下所有文本文件的大小
ll | awk 'BEGIN{}{total=total+$5} END{print(total)}'
案例2 :打印99乘法表
awk 'BEGIN{ for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%dx%d=%d%s", i, j, i*j, "\t" ) } printf("\n") } }'