zoukankan      html  css  js  c++  java
  • awk

    awk

    可以处理格式明显的文件,而sed不能

    -F:代表以分号做分隔符,print $1,$4意思是打印第1个和第4个

    [root@bogon ~]# awk -F: '{print $1,$4}' b.txt

    root 0

    bin 1

    daemon 2

    adm 4

    lp  123()17   7

    sync 0

    shutdown 0

    halt 0

    mail 12

    operator 0

    [root@bogon ~]#

    $0是取整行的意思

    [root@bogon ~]# awk -F: '{print $0}' b.txt

    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  123()17  :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

    operator:x:11:0:operator:/root:/sbin/nologin

    [root@bogon ~]#

    NF表示有多少段

    [root@bogon ~]# awk -F: '{print $1,NF}' b.txt

    root 7

    bin 7

    daemon 7

    adm 7

    lp  123()17   7

    sync 7

    shutdown 7

    halt 7

    mail 7

    operator 7

    [root@bogon ~]#

    由于我们不一定都知道最后一个是第几个,可以用NF代替

    [root@bogon ~]# awk -F: '{print $1,$NF}' b.txt

    root /bin/bash

    bin /sbin/nologin

    daemon /sbin/nologin

    adm /sbin/nologin

    lp  123()17   /sbin/nologin

    sync /bin/sync

    shutdown /sbin/shutdown

    halt /sbin/halt

    mail /sbin/nologin

    operator /sbin/nologin

    [root@bogon ~]#

    NR是序号:

    [root@bogon ~]# awk -F: '{print $1,NR}' b.txt

    root 1

    bin 2

    daemon 3

    adm 4

    lp  123()17   5

    sync 6

    shutdown 7

    halt 8

    mail 9

    operator 10

    [root@bogon ~]#

    只取第一行

    [root@bogon ~]# awk -F: 'NR==1{print $1,NR}' b.txt

    root 1

    [root@bogon ~]# awk -F: 'NR<=3 {print $1,NR}' b.txt

    root 1

    bin 2

    daemon 3

    [root@bogon ~]#

    取小于等于3行

    [root@bogon ~]# awk -F: 'NR<=3 {print NR,"------",$1}' b.txt

    1 ------ root

    2 ------ bin

    3 ------ daemon

    [root@bogon ~]#

    取交集用&&

    [root@bogon ~]# awk -F: 'NR>=3 && NR<=5 {print NR,"------",$1}' b.txt

    3 ------ daemon

    4 ------ adm

    5 ------ lp  123()17  

    [root@bogon ~]#

    或者||

    [root@bogon ~]# awk -F: 'NR<=2 || NR>=7 {print NR,"-----",$1}' b.txt

    1 ----- root

    2 ----- bin

    7 ----- shutdown

    8 ----- halt

    9 ----- mail

    10 ----- operator

    [root@bogon ~]#

    只输出nologin结尾的行

    awk -F: '/nologin$/{print $1,$3,$4}' b.txt

    第一段符合r开头,t结尾的UID($3)

    [root@bogon ~]# awk -F: '$1~/^r.*t$/{print $1,$3}' b.txt

    root 0

    [root@bogon ~]#

    用户名是root的行,信息筛选:

    [root@bogon ~]# awk -F: '$1=="root" {print $1,$2}' b.txt

    root x

    [root@bogon ~]#

    UID大于等于7的行:

    [root@bogon ~]# awk -F: '$3>=7 {print $0}' b.txt

    halt:x:7:0:halt:/sbin:/sbin/halt

    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    [root@bogon ~]#

    设置参数,UID>=3

    [root@bogon ~]# count=3

    [root@bogon ~]# awk -v x=$count -F: '$3>=x {print $1,$3}' b.txt

    adm 3

    lp  123()17   4

    sync 5

    shutdown 6

    halt 7

    mail 8

    operator 11

    awk -F是默认以空格或多个空格为分割符的,上面都指定了分号做分割

    从下面命令,得到网卡名是ens33

    [root@bogon ~]# ifconfig

    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

            inet 192.168.88.128  netmask 255.255.255.0  broadcast 192.168.88.255

            inet6 fe80::8ef4:d045:bb20:5d0a  prefixlen 64  scopeid 0x20<link>

            ether 00:0c:29:56:c5:2f  txqueuelen 1000  (Ethernet)

    取IP就是第2行第2个

    [root@bogon ~]# ifconfig | awk 'NR==2 {print $2}'

    192.168.88.128

    [root@bogon ~]#

    保存到IP中,用``

    [root@bogon ~]# ip=`ifconfig | awk 'NR==2 {print $2}'`

    [root@bogon ~]# echo $ip

    192.168.88.128

    [root@bogon ~]#

    把文件排序和排重,排重前一定要先排序

    [root@bogon ~]# cat d.txt|sort|uniq

    2222222222

    4444444444

    777777777777

    99999999999999

    aaaaaaaaaa

    [root@bogon ~]#

    -c知道去重情况

    [root@bogon ~]# cat d.txt|sort|uniq -c

          1 2222222222

          1 4444444444

          1 777777777777

          3 99999999999999

         17 aaaaaaaaaa

    [root@bogon ~]#

    除了awk可以取数据外,还有个简单的方法:cut,不过没有awk那么好,-d:是以冒号为分割,-f1是取第1个

    [root@bogon ~]# cat b.txt|cut -d: -f1

    root

    bin

    daemon

    adm

    lp  123()17 

    sync

    shutdown

    halt

    mail

    operator

    -f1是取第1部分和第3部分

    [root@bogon ~]# cat b.txt|cut -d: -f1,3

    root:0

    bin:1

    daemon:2

    adm:3

    lp  123()17  :4

    sync:5

    shutdown:6

    halt:7

    mail:8

    operator:11

    [root@bogon ~]#

    文件大小:

    [root@bogon ~]# du -sh /boot/

    126M       /boot/

    [root@bogon ~]#

    把/根目录下,name中,全部包含txt的文件都找出来,用find

    [root@bogon ~]# find / -name "*.txt"

    把/根目录下,type类型为f都找出来

    [root@bogon ~]# find / -type f

    把/根目录下,大小超过300M的文件找出来

    [root@bogon ~]# find / -size +300M

    /proc/kcore

    find: ‘/proc/4506/task/4506/fd/6’: 没有那个文件或目录

    find: ‘/proc/4506/task/4506/fdinfo/6’: 没有那个文件或目录

    find: ‘/proc/4506/fd/6’: 没有那个文件或目录

    find: ‘/proc/4506/fdinfo/6’: 没有那个文件或目录

    检查下是否大于300M

    [root@bogon ~]# ls -lh /proc/kcore

    -r-------- 1 root root 128T 12月  3 22:23 /proc/kcore

    [root@bogon ~]#

    把/根目录下,小于1k的文件找出来

    [root@bogon ~]# find / -size -1k

    把/根目录下,大于10M,小于15M的文件

    [root@bogon ~]# find / -size +10M && -15M

    文件名带txt,大小小于1K

    [root@bogon ~]# find -name "*.txt" -size -1k -type f

    ./22.txt

    ./Z.txt

    ./[1..3].txt

    ./{4...9}.txt

    [root@bogon ~]#

    test文件夹下,包含子文件夹,把正文中带root的文件和内容都找出来,文件名带root不算。

    先把文件复制过来:

    [root@bogon test]# cp /root/d.txt .

    。。。然后

    [root@bogon test]# egrep -r 'root' /test

    /test/a.txt:root

    /test/b.txt:root:x:0:0:root:/root:/bin/bash

    /test/b.txt:operator:x:11:0:operator:/root:/sbin/nologin

    /test/son/tt.txt:root

    /test/c.txt:1rootroot

    [root@bogon test]# ls

    a.txt  b.txt  c.txt  d.txt  root.txt  son

    [root@bogon test]#

    上面的结果,我只想要文件名,就用-rl

    [root@bogon test]# egrep -rl 'root' /test

    /test/a.txt

    /test/b.txt

    /test/son/tt.txt

    /test/c.txt

    [root@bogon test]#

    设置一个脚本:把之前学的命令放到一个文件中:

    [root@bogon test]# vim gaizhujiming.sh

    [root@bogon test]# cat gaizhujiming.sh

    read -p 'please input your hostname:' name

    hostnamectl set-hostname $name

    [root@bogon test]#

    改可执行权限

    [root@bogon test]# chmod +x gaizhujiming.sh

    [root@bogon test]#

    执行文件:

    [root@bogon test]# ./gaizhujiming.sh

    please input your hostname:www

    [root@bogon test]# hostname

    www

    [root@bogon test]#

     

  • 相关阅读:
    【Nginx学习】安装及常用命令
    【Nginx学习】基础知识
    【Nginx学习】Xshell7连接CentOS7艰难轶事
    【LeetCode刷题】5343. 多次求和构造目标数组:妙解
    【LeetCode刷题】1353. 最多可以参加的会议数目
    【转载】priority_queue用法
    【LeetCode刷题】供暖器:妙解
    【妙解】重复的子字符串
    【转载学习】基金理财学习
    【转载】sync_with_stdio + cin.tie
  • 原文地址:https://www.cnblogs.com/jensenxie/p/8025353.html
Copyright © 2011-2022 走看看