zoukankan      html  css  js  c++  java
  • awk的一些认识

    awk

    awk '{pattern + action}' {filenames}
    当我们所指定的规则脚本过长的时候,我们可以使用-f的选项加上我们的脚本文件。再复杂点我们可以直接调用shell脚本,就像我们在编写python时需要加上解释器一样,我们调用#!/bin/awk这样也可以进行调用。

    root@kali:~# awk 'NR==1{print}' testip.txt
    192.168.114.1
    root@kali:~# awk 'NR==4{print}' testip.txt
    192.168.114.4
    

    此处NR作为内置变量功能就是记录个数,也就是行数,那么我们可以利用NR显示具体行数内容。//FNR都是表示总的行数。

    root@kali:~# awk 'BEGIN {print "The data3 File Contents:"}
    {print}
    END {print "End of File"}' testip.txt
    The data3 File Contents:
    192.168.114.1
    192.168.114.2
    192.168.114.3
    192.168.114.4
    192.168.114.5
    

    BEGIN与END关键词。效果如上

    root@kali:~# awk '$1 && NR==1 {print}' testip.txt
    192.168.114.1
    root@kali:~# awk '$2 && NR==1 {print}' testip.txt
    

    $x显示的是具体列数,我们配合逻辑符号,可以进行筛选。我们可以看见,当我们想要查找第二列的时候返回的是空集,这里就说明了是不存在第二列的。//注意$0代表的是整个文本行

    root@kali:~# awk '/^$/ {print "Blank line"}' testip.txt
    Blank line
    

    这里我们在文档中挖了几个空格,利用正则表达式将所有空白行全部都显示了出来。

    root@kali:~# awk '!/3/ && /1/ {print}' testip.txt 
    192.168.114.1
    192.168.114.2
    192.168.114.5
    192.168.114.6
    192.168.114.7
    192.168.114.8
    192.168.114.9
    192.168.114.10
    

    同上我们仍然利用正则表达式选取出了不包含3,但是包含1的那些ip地址。

    root@kali:~# awk 'NR==1 {print $1}' testip.txt
    192.168.114.1
    root@kali:~# awk -F "." 'NR==1 {print $1}' testip.txt
    192
    root@kali:~# awk -F "." 'NR==1 {print $2}' testip.txt
    168
    

    在此处我们可以看到之前我们没有加上-F参数,这样的就过就是分段分了一整段,但是我们利用-F参数指定.为分隔符号,此时我们可以看见自然而然地哪么此时就是以上结果了。

    root@kali:~# awk 'BEGIN{system("ifconfig")}'
    bridge0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 192.168.3.6  netmask 255.255.255.0  broadcast 192.168.3.255
            ether 9e:df:30:34:30:af  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3  bytes 234 (234.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.114.128  netmask 255.255.255.0  broadcast 192.168.114.255
            inet6 fe80::20c:29ff:fe12:e944  prefixlen 64  scopeid 0x20
            ether 00:0c:29:12:e9:44  txqueuelen 1000  (Ethernet)
            RX packets 5244  bytes 1430889 (1.3 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 46  bytes 5063 (4.9 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
            device interrupt 19  base 0x2000  
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 9  bytes 475 (475.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 9  bytes 475 (475.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    我们可以利用awk调用系统命令,system函数,当然我们直接放到bash里面也可以进行。

    root@kali:~# awk 'BEGIN{print "ifconfig"| "/bin/bash"}' 
    bridge0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
            inet 192.168.3.6  netmask 255.255.255.0  broadcast 192.168.3.255
            ether 9e:df:30:34:30:af  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 3  bytes 234 (234.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.114.128  netmask 255.255.255.0  broadcast 192.168.114.255
            inet6 fe80::20c:29ff:fe12:e944  prefixlen 64  scopeid 0x20
            ether 00:0c:29:12:e9:44  txqueuelen 1000  (Ethernet)
            RX packets 5486  bytes 1496859 (1.4 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 46  bytes 5063 (4.9 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
            device interrupt 19  base 0x2000  
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 9  bytes 475 (475.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 9  bytes 475 (475.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

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

  • 相关阅读:
    hdu 4009 Transfer water(最小型树图)
    如何使用java调用DLL运行C++(初篇)
    腾讯笔试题(2015)
    md5算法原理一窥(其一)
    hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )
    Java 基础知识点(必知必会其二)
    Java 基础知识点(必知必会其一)
    web基础之hibernate(一篇)
    web基础之Structs(一篇)
    mysql知识初篇(一)
  • 原文地址:https://www.cnblogs.com/ophxc/p/12692141.html
Copyright © 2011-2022 走看看