(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 $* $# [email protected] 这几个固定变量对于编写脚本的帮助很大
编写如下脚本:
测试:
从上面的实验中可以看出$0 $1 $2 $3 $# $* [email protected]
$0 脚本名称
$1 输入的第一个字符
$2 输入的第二个字符
$3 同上
$# 脚本执行时候输入的参数的个数
$* 输入的参数的具体内容(将输入的参数作为一个单词)
[email protected] 输入的参数的具体内容(将输入的参数作为一个由多个参数组成的列表)
特殊变量的应用(实验):
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)