(Shell)Linux之shell基础--awk

awk 报告生成器

awk 处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理>完最后一行做一些总结性质的工作,在命令格式上分别体现如下:
        BEGIN{}:读入第一行文本之前执行,一般用来初始化操作
        {}:逐行处理,逐行读入文本执行响应的处理,是最常见的编辑命令
        END{}:处理完最后一行文本之后执行,一般用来输出处理结果

awk基本用法

linux上面默认使用gawk

awk '{print FILENAME}' passwd 将passwd文件中的每一行的文件名称输出
awk -F : '{print "第"NR"行,有"NF"列"}' passwd将passwd文件中的每一行用“:”分隔打印出来每一行有多少列
awk -F : 'BEGIN{print "start"}{print $1}END{print "end"}' passwd将文件passwd文件用“:”分隔,输出分隔后的每一行的第一1列
awk  -F : '/bash$/{print $1}'将以bash结尾的用户名称输出出来
awk -F : 'BEGIN{print "NAME"}{print $1}' passwd将名字输出,并在前面加上NAME字样
 awk -F : '!/bash$/{print $1}' passwd

将结尾是非bash的名字输出出来

awk 'BEGIN{a=34;print a+12}'输出34加12,说明awk是可以进行数值的简单运算的
awk -F : '/^root/{print $6}' passwd将文件以:为分隔符号将以root开头的用户加目录输出出来
awk -F : '/home/{print $1}' passwd将用户家目录在home底下的用户输出

awk '{print FILENAME}' passwd                                    ###将passwd文件中的每一行的文件名称输出

awk -F : '{print "第"NR"行,有"NF"列"}' passwd         ###将passwd文件中的每一行用“:”分隔打印出来每一行有多少列

awk -F : 'BEGIN{print "start"}{print $1}END{print "end"}' passwd   ##将文件passwd文件用“:”分隔,输出分隔后的每一行的第一1列

awk  -F : '/bash$/{print $1}'     passwd                                       ###将以bash结尾的用户名称输出出来

awk -F : 'BEGIN{print "NAME"}{print $1}' passwd      ###将名字输出,并在前面加上NAME字样

awk -F : '!/bash$/{print $1}' passwd                             ###将结尾是非bash的名字输出出来

awk 'BEGIN{a=34;print a+12}'                                       ###输出34加12,说明awk是可以进行数值的简单运算的

awk -F : '/^root/{print $6}' passwd                                 ###将文件以:为分隔符号将以root开头的用户加目录输出出来

awk -F : '/home/{print $1}' passwd                                ###将用户家目录在home底下的用户输出

 

2.awk命令扩展:

awk '/^[a-d]/{print}' passwd    ##将passwd文件中的以a-d开头的行输出

awk -F : '$6~/\<bin$/' passwd    ###将第六列的以bin结尾的行数输出:

awk '!/^[^a-d]/{print}' passwd   ###将文件中以a-d开头的行输出出来,和之前的通配符可以兼容

测试:将系统中家目录在/home下,可以登录的用户输出:

awk -F : '$6!~/^\/home/&&/bash$/{print $1}' passwd    

注:要合理利用转义符

2.抓取eth0的ip

实现代码:ifconfig eth0|awk -F " " '/inet /{print $2}'

将有“inet “(注:前面的inet后面加上了一个空格),字符的一行摘录出来,再将文字用空格分隔将分隔后的第二列输出:

 

Find命令:

find /mnt -size 20k -exec rm -rf {} \;   这个括号可以接收前面的输出
后面加上\;   ###后面的\是转义符号 ";"

 

find -name              ###根据名字查找
       -maxdepth      ###根据深度查找
       -mindepth       ###根据最小深度查找

注:此命令对于查找深度的设置要在别的参数前面

find /etc/ -maxdepth 2 -name passwd    ###将/etc目录下的名字是passwd,查找的最大深度是2的文件

find /etc/ -mindepth 2 -name passwd    ###将/etc目录下的名字是passwd,查找的最小深度是1的文件

        -not                  ###
       -user                ###根据用户查找
       -group              ###根据用户组查找
       -a                     ###表示and
       -o                     ###表示or

实验:在test目录下创建文件:文件用户和组修改为:

find /test/ -user student

find /test/ -group student

find /test/ -group student -a -user student

find /test/ -group student -o -user student

find /test/ -group student -a -not -user student

       -size 20k         ###根据文件的大小查找
       -size -20k        ###查找小于20k的文件
       -size +20k       ###查找大于20k的文件

dd if=/dev/zero of=/test/test1/file1   --size=1024 --count=20 ###截取大小为20k的文件,将file1,file2,file3分别设置成10k,20k,30k的文件

find .  -size +20k -exec rm -rf {} \;      ###将文件大小大于20k的文件删除

find . -size -20K -exec rm -rf {}  \;      ###将文件大小小于20k的文件删除

-type    后面可以加上 f     L    S    b      d     c 分别是file类型,L 连接类型,S套接字类型,b块类型,d目录类型,c字符设备

find   / -type d     ###查找目录类型的文件

-ctime 10     ###更改时间是10天的
-ctime -10    ###更改时间小于10天的
-ctime +10    ###更改时间大于10天的
-cmin +|-10   ###更改时间大于10分钟
-cmin 10      ###更改时间是10分钟的文件

 

    -perm /644    ###随便一个满足,(此644,可以分隔成4+2,4,4一共有四个条件)比如200可以满足上面的条件   企业7之前用的是+
    -perm 444     ###准确查找文件的权限是444的文件
    -perm -444    ###查找文件权限中,有一个是4的权限的文件

变量:

变量的定义:
变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值

变量是一种使用方便的占位符,用于阴影计算机内存地址,该地址可以存储Script运行和是可更改的程序信息
在shell中变量是不能永久保存在系统中的,必须在文件中声明

变量的声明:

在未声明变量的时候,会有如下情况:脚本用不了当前设置的变量!

注:脚本中写的是echo $a

1.在当前shell中声明:

export a=1将当前的a的值声明出去,新写的脚本也可以用到,但是在新开了一个shell就不能在使用了

新开了一个shell 测试:

2.给用户设置,在用户运行的环境上声明a的值:在切换用户失效

vim ~/.bashrc_profile  当前用户的shell声明

在切换用户(包括用户环境的切换)之后,运行脚本test1:

在不切换用户环境的时候,运行脚本test1:

这也就侧面理解了在切换用户的时候加上这一个“-“是什么作用,环境变量

3.在全局环境上设置:此时当前主机上的所有用户都可以使用当前声明的变量,在做这一实验的时候要将上面实验的设置恢复,并且重新运行配置文件。

变量名称的规范:

变量名称中通常包含大小写字母,数字,下划线(不是必须)
变量名称格式:
WESTOS_LINUX
Westos_Linux
westoS_Linux

固定(特殊)变量:

理解$0   $1  $2  $3  $*  $#  $@   这几个固定变量对于编写脚本的帮助很大

编写如下脚本:

测试:

从上面的实验中可以看出$0   $1   $2   $3   $#   $*   $@

$0   脚本名称

$1   输入的第一个字符

$2   输入的第二个字符

$3   同上

$#   脚本执行时候输入的参数的个数

$*   输入的参数的具体内容(将输入的参数作为一个单词)

$@   输入的参数的具体内容(将输入的参数作为一个由多个参数组成的列表)

特殊变量的应用(实验):

1.脚本目标要求:user_create.sh  user1 user2 user3 ;创建后面输入的用户

实验结果截图:

脚本的输入和输出

创建脚本文件,脚本文件中写入:(此语句可以将在shell里的输入赋值给指定变量)

加密传输:

实验:脚本要求:

脚本:

###########################
# Author: unn                                    #
# Create_Date:2019-03-02           #
###########################
#!/bin/bash
echo "Please input action :
 [C]reate  [D]elete  [E]xit"
Input_Cmd(){
read -p "Action :" INPUT_ACTION
ACTION=`echo $INPUT_ACTION|tr 'A-Z' 'a-z'`
[ "$ACTION" != "c" -a "$ACTION" != "d" -a "$ACTION" != "e" ]&&{
    echo "input error!!"
    Input_Cmd
    }
}
Input_Cmd
User_Add(){
[ "$ACTION" = c ]&&{
    read -p "Please input username:"  USERNAME
    [ -z "$USERNAME" ]&&{
    echo "input error! Please input again"
    User_Add
    }||{
        id $USERNAME &>/dev/null &&{
           echo   "$USERNAME is exist! Try another name"
          User_Add
            }||{
                read -p "Please input password:" PASSWD
                useradd $USERNAME
                echo $PASSWD |passwd --stdin $USERNAME >/dev/null
                echo "$USERNAME was created success!"
                }
    }    
}
}
User_Add
User_Del(){
[ "$ACTION" = d ]&&{
    read -p "Please input username:"  USERNAME
    [ -z "$USERNAME" ]&&{
        echo "input error!"
        User_Del
    }||{
            id $USERNAME &> /dev/null &&{
                userdel -r $USERNAME &>/dev/null
                echo "$USERNAME was deleted success!"
            }||{
                echo "No such user!"
                User_Del    
                }
        }
}
}
User_Del
Exit(){
[ "$ACTION" = e ]&&{
    exit
}
}
Exit

测试;

系统返回值:

系统在执行命令的时候会有返回值,这个返回值有很多种,读者可以自定百度,看下面这个实验:

注:系统判断真假时候0为真,其他所有返回值都是假,读者可以设计步骤自行测试

Linux系统中命令别名的设定:

alias xie ='vim'    ###将xie设置成vim的别名

unalias xie          ###取消别名


vim ~/.bashrc    ##在当前用户环境下,将xie设置成vim的别名
alias xie='vim‘


vim /etc/bashrc 全局设定
alias xie='vim'

小知识:

1.双引号不能引用的符号类型:`   !   ?   $

2.``和$()的区别

#!/usr/bin/perl   ###此时不可用$(),但是``可以用  也就是说``是通用的
print $(date)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值