这是我参与更文挑战的第16天,活动详情查看:更文挑战
文本分析
一、cut命令
- 作用
- 显示切割的行数据
- 参数
–d:在里面写上分隔符(如下是空格)- f:选择要显示哪几个列
#1. 显示第一列,默认的分隔符为空格 [root@node01 ~]# cut -d' ' -f1 grep.txt oxx12121212ooxx ooxx oox 1212 oo3xx oo4xx ooWxx oomxx $ooxx oo1234xx ooxyzxx #2. 显示1到3列 [root@node01 ~]# cut -d' ' -f1-3 grep.txt oxx12121212ooxx ooxx 12121212 oox 12121212 1212 ooxx 1212 oo3xx oo4xx ooWxx oomxx $ooxx oo1234xx ooxyzxx 复制代码
- s:不现实没有分隔符的行
[root@node01 ~]# cut -d' ' -s -f1-3 grep.txt ooxx 12121212 oox 12121212 1212 ooxx 1212 复制代码
二、sort命令
- 两种排序方式
- 按照数值排序
- 按照数值大小排序
- 按照字典排序
- 按照数字的第一个数字排序,比如
1,11,15,7,71,9
- 按照数字的第一个数字排序,比如
- 按照数值排序
- 作用
- 排序文件的行
- 参数
- t:选择分隔符
- k:选择排序列
- r:倒序
- n:按数值排序
- u:合并相同行
- f:忽略大小写
#1. 默认按照字典排序
[root@node01 ~]# sort -t' ' -k2 sort.txt
apple 1
nana 12
orange 8
#2. 按数值倒序排序
[root@node01 ~]# sort -t' ' -n -r -k2 sort.txt
nana 12
orange 8
apple 1
复制代码
三、wc命令
- 作用
- 统计(字符、字节、行)个数
- 参数
- w:字符个数
- c:字节数
- l:行数
- 使用
- 可以先用cat读取再用管道来操作
//三行 [root@node01 ~]# cat sort.txt | wc -l 3 复制代码
四、sed命令:行编辑器
- 基础参数
- n:静默模式,不现实文件里的内容,只显示被修改过的内容
- i:直接修改源文件
- 动态参数
- -[number]p:显示指定的行
#只显示第三行的内容 [root@node01 ~]# cat sort.txt banana 12 sju apple 1 sju [root@node01 ~]# sed "3p" -n sort.txt apple 1 复制代码
- -[number]d:删除掉一行
#删除第二行 [root@node01 ~]# sed "2d" sort.txt banana 12 apple 1 sju 复制代码
- -[number]a\string:在指定行的后面加上string
- -[number]i\string:在指定行的前面加上string
//后面 [root@node01 ~]# cat sort.txt banana 12 sju apple 1 sju [root@node01 ~]# sed "2a\hello" sort.txt banana 12 sju hello apple 1 sju //前面 [root@node01 ~]# sed "2i\hello" sort.txt banana 12 hello sju apple 1 sju 复制代码
- -s/pattern/string/:查找并替换
- g:行内全局替换
- i:忽略字符大小写
- s///,s###,s@@@都可以
#将id:3:initdefault: 里的3替换为8 sed "s/\(id:\)[0-9]\(:initdefault:\)/\18\2/" -i sort.txt 复制代码
- 用sed直接在命令行修改ip
[root@node01 ~]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.85.101
NETMASK=255.255.255.0
GATEWAY=192.168.85.2
DNS1=114.114.114.114
DNS2=8.8.8.8
//第一种:改为188
//这种方式有问题,如果源ip有问题那么修改过后的还是错误内容
[root@node01 ~]# sed "s/\(IPADDR=\([0-9]\?[0-9]\?[0-9]\.\)\{3\}\).*/\1188/" ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.85.188
NETMASK=255.255.255.0
GATEWAY=192.168.85.2
DNS1=114.114.114.114
DNS2=8.8.8.8
//第二种
//给ip的每一位都固定范围,如果源ip有问题就匹配不到了
[root@node01 ~]# sed "s/\(IPADDR=\(\([0-9]\|[1-9][0-9]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\).*/\188/" ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.85.88
NETMASK=255.255.255.0
GATEWAY=192.168.85.2
DNS1=114.114.114.114
DNS2=8.8.8.8
复制代码
五、awk命令
- 作用
- awk是一个强大的文本分析工具。
- 简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
- 用法
awk -F '{pattern + action}' {filenames}
支持自定义分隔符
支持正则表达式匹配
支持自定义变量,数组 a[1] a[tom] map(key)
支持内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
支持函数
print、split、substr、sub、gsub
支持流程控制语句,类C语言
if、while、do/while、for、break、continue
复制代码
- 案例一
#0. 数据源
[root@node01 ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
#1. 只是显示/etc/passwd的账户
//1.1awk
[root@node01 ~]# awk -F':' '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
vcsa
saslauth
postfix
sshd
//1.2cut
[root@node01 ~]# cut -d':' -f1 passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
vcsa
saslauth
postfix
sshd
#2. 只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以制表符分割,而且在所有行开始前添加列名name,shell,在最后一行添加"blue,/bin/nosh"
//2.1awk
[root@node01 ~]# awk -F':' 'BEGIN{ print "name\tshell"}{print $1 "\t" $7}END{print "blue\t/bin/nosh"}' passwd
name shell
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
uucp /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
gopher /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
vcsa /sbin/nologin
saslauth /sbin/nologin
postfix /sbin/nologin
sshd /sbin/nologin
blue /bin/nosh
#3. 搜索/etc/passwd有root关键字的所有行
<!--
$0表示输出这个行所有内容
-->
[root@node01 ~]# awk '/root/ {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
#4. 统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
<!--
NR:行
NF:列
$0:整个行的内容
-->
[root@node01 ~]# awk -F':' '{print NR "\t" NF "\t" $0}' passwd
1 7 root:x:0:0:root:/root:/bin/bash
2 7 bin:x:1:1:bin:/bin:/sbin/nologin
3 7 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 7 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 7 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 7 sync:x:5:0:sync:/sbin:/bin/sync
7 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 7 halt:x:7:0:halt:/sbin:/sbin/halt
9 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 7 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11 7 operator:x:11:0:operator:/root:/sbin/nologin
12 7 games:x:12:100:games:/usr/games:/sbin/nologin
13 7 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15 7 nobody:x:99:99:Nobody:/:/sbin/nologin
16 7 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
17 7 saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
18 7 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19 7 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
复制代码
- 案例二
#1. 数据源
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
#2. 统计报表:合计每人1月工资
//1.1
[root@node01 ~]# awk '{split($3,data,"-");if(data[2]=="01"){name[$1]+=$5};if($2=="0"){role[$1]="manager"}else{role[$1]="worker"}}END{for (i in name){print i "\t" role[i] "\t" name[i]}}' awk.txt
vivi worker 2800
Tom manager 2500
hn worker 1000
John worker 3500
//1.2写到一个文件里awk.ssh
{
split($3,data,"-");
if(data[2]=="01"){
name[$1]+=$5
};
if($2=="0"){
role[$1]="manager"
}else{
role[$1]="worker"
}
}
END{
for (i in name){
print i "\t" role[i] "\t" name[i]
}
}
命令行:
[root@node01 ~]# awk -f awk.ssh awk.txt
vivi worker 2800
Tom manager 2500
hn worker 1000
John worker 3500
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END