Linux04——文本分析

这是我参与更文挑战的第16天,活动详情查看:更文挑战

文本分析

一、cut命令

  1. 作用
    • 显示切割的行数据
  2. 参数
    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. 两种排序方式
    • 按照数值排序
      • 按照数值大小排序
    • 按照字典排序
      • 按照数字的第一个数字排序,比如1,11,15,7,71,9
  2. 作用
    • 排序文件的行
  3. 参数
    • 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命令

  1. 作用
    • 统计(字符、字节、行)个数
  2. 参数
    • w:字符个数
    • c:字节数
    • l:行数
  3. 使用
    • 可以先用cat读取再用管道来操作
    //三行
    [root@node01 ~]# cat sort.txt | wc -l
    3
    复制代码

四、sed命令:行编辑器

  1. 基础参数
    • n:静默模式,不现实文件里的内容,只显示被修改过的内容
    • i:直接修改源文件
  2. 动态参数
    • -[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
    复制代码
  3. 用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命令

  1. 作用
    • awk是一个强大的文本分析工具。
    • 简单来说awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。
  2. 用法
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语言
ifwhiledo/whileforbreakcontinue
复制代码
  1. 案例一
#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. 案例二
#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
喜欢就支持一下吧
点赞0 分享