首页 > 系统相关 >Shell编程规范与变量三

Shell编程规范与变量三

时间:2023-08-13 19:22:52浏览次数:55  
标签:Shell grep 变量 编程 echo awk 匹配 root localhost

目录

1. 正则表达式

  • 通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符
[localhost ~]#man 7 regex
#可以使用man手册帮助

1.1 元字符

.   匹配任意单个字符,可以是一个汉字  
[]   匹配指定范围内的任意单个字符,示例:[zhou]   [0-9]   []   [a-z A-Z]   [:alpha:]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
[root@localhost ~]#ls /etc/|grep rc[.0-6]
#此处的点代表字符

[root@localhost ~]#ls /etc/ | grep 'rc\.'
#点值表示点需要转义

[root@localhost ~]# grep r..t /etc/passwd         
#r..t ..代表任意两个字符

[root@localhost ~]# echo abc |grep a.c              
#表示原来的点需要加\转义

[root@localhost ~]# echo abc |grep a\.c
#不加引号有时匹配会有出入

[root@localhost ~]# echo abc |grep 'a\.c'          
#标准格式需要加'' 或者""

[root@localhost ~]# ls |grep '[zhou].txt'    
#匹配[]中任意一个字符

[root@localhost ~]# ls [a-d].txt                
#通配符

[root@localhost ~]# ls |grep '[a-d].txt'             
#真正的小写在正则表达式中

[root@localhost ~]# ls |grep '[^a-z].txt'   
#显示非小写字母

[root@localhost ~]# ls |grep '[^a.z].txt'     
#[]里就是本意不需要转义

1.2 表示次数

*        #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.*       #任意长度的任意字符,不包括0次
\?       #匹配其前面的字符出现0次或1次,即:可有可无
\+       #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\}    #匹配前面的字符n次
\{m,n\}  #匹配前面的字符至少m次,至多n次
\{,n\}   #匹配前面的字符至多n次,<=n
\{n,\}   #匹配前面的字符至少n次
示例
[root@localhost ~]#echo 2452450982 | grep '[0-9]\{5,12\}'   #过滤QQ号
2452450982


[root@localhost ~]#ifconfig ens33 | grep netmask    #匹配子网掩码
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
[root@localhost ~]#ifconfig ens33 | grep netmask | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+'    #匹配地址
192.168.8.100
255.255.255.0
192.168.8.255
[root@localhost ~]#ifconfig ens33 | grep netmask | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1   #匹配IP地址
192.168.8.100


[root@localhost ~]#ifconfig ens33 | grep netmask | tr -s ' ' | cut -d ' ' -f3  #匹配IP地址
192.168.8.100


[root@localhost ~]#cat /etc/fstab | grep -o '\b[[:alpha:]]\+\b' | wc -l  #匹配单词数
46


[root@localhost ~]#cat /etc/fstab | grep -v '^$' | grep '^[^#]'   #过滤不是以#开头的行
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=773916b1-ec4c-45ee-ac99-fa9a0cad9565 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

1.3 位置锚定

^    #行首锚定, 用于模式的最左侧
$    #行尾锚定,用于模式的最右侧
^PATTERN$  #用于模式匹配整行 (单独一行  只有root)
^$   #空行
^[[:space:]]*$  #空白行


\< 或 \b        #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

1.4 分组或其他

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名

方式为: \1, \2, \3, ...

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

或者
或者:\|
[root@localhost ~]#echo abcabcabc | grep '\(abc\)\{3\}'  #匹配3次abc
abcabcabc

1.5 扩展正则表达式

grep -E

  • 表示次数
*     #匹配前面字符任意次
?     #0或1次
+     #1次或多次
{n}   #匹配n次
{m,n} #至少m,至多n次
{,n}  #匹配前面的字符至多n次,<=n,n可以为0
{n,}  #匹配前面的字符至少n次,<=n,n可以为0
  • 表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者  
a|b        #a或b
C|cat      #C或cat
(C|c)at  #Cat或cat
示例
[root@localhost ~]#ifconfig ens33 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'  #匹配地址
192.168.8.100
255.255.255.0
192.168.8.255
[root@localhost ~]#ifconfig ens33 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1  #匹配IP地址
192.168.8.100

[root@localhost ~]#cat /dev/random | tr -dc [[:alnum:]] | head -c 12   #随机生成密码
[zDoFqM6r37N[root@localhost ~]#cat /dev/random | tr -dc [[:alnum:]] | head -c 12
rsb9xJiPyMkc[root@localhost ~]#cat /dev/random | tr -dc [[:alnum:]] | head -c 12
FUaeRUSdMv3Z[root@localhost ~]#cat /dev/random | tr -dc [[:alnum:]] | head -c 12
N9cdfOpAuL46[root@localhost ~]#
[root@localhost ~]#cat passwd | cut -d: -f1,4 /etc/passwd   #取文件第1和第4列,冒号分隔
[root@localhost ~]#cat log | cut -d ' ' -f1 | sort -rn | uniq -c | head
   4477 172.16.13.251
   4512 172.16.13.250
   4549 172.16.13.249
   4528 172.16.13.248
   4606 172.16.13.247
   4414 172.16.13.246
   4567 172.16.13.245
   4594 172.16.13.244
   4555 172.16.13.243
   4444 172.16.13.242

1.6 grep

grep [选项]… 查找条件 目标文件

选项
-i:查找时忽略大小写
-v:反向查找,输出与查找条件不相符的行
-n:显示匹配行的行号
-o:只显示匹配项
-f:对比两个文件的相同行
-c:打印匹配的行数
  • -E:扩展的正则表达式,相当于egrep(可以识别特殊正则符号)
  • -e:实现多个选项间的逻辑or关系,或者使用egrep

2. AWK

awk语言

  • 读取一行处理一行

  • 在 Linux/UNIX 系统中,awk 功能强大的编辑工具,逐行读取输入文本,

  • 默认以空格 /tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。

  • awk比较倾向于将一行分成多个字段然后进行处理。

  • AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

格式
awk 选项      模式        值         文件
awk option  'program'  var=value   file…

选项:
-F:指定分隔符
-v:自定义变量
-f:脚本
[root@localhost ~]#df | awk '{print $2,$1}'   #挑取指定列
1K-块 文件系统
31441920 /dev/mapper/centos-root
917604 devtmpfs
933524 tmpfs
933524 tmpfs
933524 tmpfs
5232640 /dev/sda1
186708 tmpfs
186708 tmpfs
           
                                   #提取感兴趣的行 #挑取感兴趣的列
[root@localhost ~]#ifconfig ens33 | awk '/netmask/{print $2}'
192.168.8.100
[root@localhost ~]#echo $PATH | awk -F: -v OFS="\n" '{print $1,$2}'
/usr/local/sbin
/usr/local/bin
#OFS表示输出时的分隔符

[root@localhost ~]#echo $PATH | awk -F: '{print $1,$2}'
/usr/local/sbin /usr/local/bin
[root@localhost ~]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]#echo $PATH | awk -F: '{print $(NF-1)}'
/usr/bin
[root@localhost ~]#ifconfig ens33 | awk 'NR%2==0'
        inet 192.168.8.100  netmask 255.255.255.0  broadcast 192.168.8.255
        ether 00:0c:29:76:f0:1a  txqueuelen 1000  (Ethernet)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]#ifconfig ens33 | awk 'NR==2{print$2}'
192.168.8.100


[root@localhost ~]#ifconfig ens33 | awk 'NR%2==0{print NR}'
2
4
6
8

[root@localhost ~]#cat /etc/passwd | awk -F: '$3>1000{print $1}'
nfsnobody
[root@localhost ~]#cat /etc/passwd | awk -F: '$3>1000{print}'
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost ~]#cat /etc/passwd | awk -F: '$3>=1000{print}'
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
lj:x:1000:1000:LJ:/home/lj:/bin/bash

[root@localhost ~]#awk '{print FNR}' /etc/issue /etc/os-release
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

[root@localhost ~]#awk '{print NR}' /etc/issue /etc/os-release
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

[root@localhost ~]#awk '{print FNR,$0}' /etc/issue /etc/os-release
1 \S
2 Kernel \r on an \m
3 
1 NAME="CentOS Linux"
2 VERSION="7 (Core)"
3 ID="centos"
4 ID_LIKE="rhel fedora"
5 VERSION_ID="7"
6 PRETTY_NAME="CentOS Linux 7 (Core)"
7 ANSI_COLOR="0;31"
8 CPE_NAME="cpe:/o:centos:centos:7"
9 HOME_URL="https://www.centos.org/"
10 BUG_REPORT_URL="https://bugs.centos.org/"
11 
12 CENTOS_MANTISBT_PROJECT="CentOS-7"
13 CENTOS_MANTISBT_PROJECT_VERSION="7"
14 REDHAT_SUPPORT_PRODUCT="centos"
15 REDHAT_SUPPORT_PRODUCT_VERSION="7"
16 


[root@localhost ~]#awk -F: '{print NR,$1}' /etc/passwd

[root@localhost ~]#awk -F: '{print NR,$1}' /etc/passwd | cat -A

3.常用脚本

#!/bin/bash

cat <<EOF
1.搭建本地yum仓库
2.关闭防火墙
3.关闭selinux
4.免密登录
5.修改主机名
6.查看系统信息(五大性能)
7.自动磁盘分区
EOF

read -p "请输入数字选择功能:(1-7)" number

case $number in
1)
read -p "先测试网络是否连接(点击回车自动测试)" ip
ping -c 3 114.114.114.114
if [ $? -eq 0 ]
then
      echo  "网络正常"

read -p "是否开始搭建本地yum仓库(yes/no)" key
key=`echo $key | tr 'A-Z' 'a-z'`
case $key in
y|yes)

       echo "请耐心等待安装......"

#关闭防火墙
systemctl stop firewalld.service
#临时关闭selinux
setenforce 0

#挂载提供安装包和元数据
mount /dev/sr0 /mnt

#切换到客户端的指定目录
cd /etc/yum.repos.d/

#建立文件夹存放网络yum仓库的配置文件
mkdir bak

#将网络源移走,减少干扰
mv *.repo bak/

#编写本地yum仓库
echo "
[lj]
name=lj
baseurl=file:///mnt
gpgcheck=0
">local.repo

#清理缓存
yum clean all

#重新构建元数据
yum makecache

;;

n|no)

echo "取消安装"

;;

*)

echo "输入有误!"

esac

else
        echo  "网络无连接"
fi
;;
2)
systemctl status firewalld | grep "is not running" &>/dev/null
if [ $? -eq 0 ]
then
   echo "防火墙处于关闭状态!"

else
   read -p "防火墙处于开启状态,是否需要关闭防火墙:(yes|no)" key
key=`echo $key | tr 'A-Z' 'a-z'`
case $key in
y|yes)
   #关闭防火墙
   systemctl stop firewalld.service
   echo "防火墙关闭成功!"

;;

n|no)

echo "防火墙未关闭!"

;;

*)

echo "输入有误!"

esac

fi
;;
3)
getenforce | grep Enforcing&>/dev/null
if [ $? -eq 0 ]
then
   echo "selinux正在运行中……"
   #临时关闭selinux
   setenforce 0

  getenforce | grep Enforcing&>/dev/null
  if [ $? -eq 0 ]
  then
   echo "selinux关闭失败,请重新关闭!"
  else
   echo "selinux临时关闭成功!"
  fi

else
   echo "selinux已经是关闭状态!"

fi
;;
4)
PASS=123123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
;;
5)
read -p "请输入要修改的名字:" name

hostnamectl set-hostname $name

bash
;;
6)
ip=$(ifconfig ens33|grep netmask|tr -s ' '|cut -d' ' -f3)
mem=`free -h | grep Mem | tr -s ' ' | cut -d ' ' -f2`
host=`hostname`
kernel=`uname -r`
disk=`lsblk |grep disk|tr -s ' '|cut -d ' ' -f4`
cputy=`lscpu |grep 型号名称|tr -s ' '|cut -d ' ' -f2-7`
cpuhs=`lscpu |grep 'CPU(s):'|tr -s ' '|cut -d ' ' -f2`

echo "该主机的ip地址为:$ip"
echo "该主机的总内存为:$mem"
echo "该主机的主机名为:$host"
echo "该主机的内核版本为:$kernel"
echo "该主机的disk大小为:$disk"
echo "该主机的CPU型号为:$cputy"
echo "该主机的CPU核数为:$cpuhs"
;;
7)
echo "- - -" >/sys/class/scsi_host/host0/scan
echo "- - -" >/sys/class/scsi_host/host1/scan
echo "- - -" >/sys/class/scsi_host/host2/scan
echo -e "n\n\n\n\n\nw" | fdisk /dev/sdb
;;

esac

标签:Shell,grep,变量,编程,echo,awk,匹配,root,localhost
From: https://www.cnblogs.com/LJ69/p/17623419.html

相关文章

  • java 8 函数式编程
    函数式编程1.Lambda表达式1.1概念对某些匿名内部类的写法优化,特点是可推导可省略。基本格式:(参数列表)->{代码}。例如:newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("运行进程");......
  • 并发编程 --- CAS原子操作
    介绍CAS(CompareAndSwap)是一种无锁算法的实现手段,中文名称为比较并交换。它由CPU的原子指令实现,可以在多线程环境下实现无锁的数据结构。原理CAS的原理是:它会先比较内存中的某个值是否和预期值相同,如果相同则更新这个值,否则不做任何操作。这整个过程是原子的,所以可以在......
  • 如何在C语言中进行图形界面编程
    在C语言中进行图形界面编程是一项非常有挑战性和有趣的任务。虽然C语言主要用于系统级编程和算法开发,但我们仍然可以使用一些库来实现简单的图形界面。在本文中,我将介绍一种在C语言中进行图形界面编程的方法。首先,让我们来了解一下几个常用的图形库,它们可以帮助我们在C语言中创建......
  • C语言编程教程:如何提取手机尾数
    C语言编程教程:如何提取手机尾数在C语言编程中,我们经常需要处理各种数据类型和操作。今天,我们将分享一个有趣且实用的主题:如何提取手机尾数。手机尾数是手机号码中的最后几位数字,提取这些数字可以为我们的程序带来更多可能性。在本文中,我们将介绍一种简洁而有效的方法,帮助你轻松提......
  • ApiPost自定义环境变量 缓存token的操作步骤
    使用场景:测试的时候获取token,然后其他请求的时候自动带token。获取Token后,执行后执行脚本,apt.variables.set("token",response.json.access_token);请求回来的参数在json中,根据需要修改这时候token就存储到环境变量中了2.使用的时候如下:......
  • 用Wpf做一个Block编程画板(仿scratch)
    前言,当时想写这个东西(AIStudio.Wpf.Block)主要是陪我儿子学scratch,觉得这种编程语言挺有意思,但是没有想到自己写一个是如此的复杂,感觉给自己挖坑了,后续的工程也非常巨大,先发出一部分来看看,上几个动图。1.helloworld2.加法3.画线本次更新先发布这些内容,后续进展,敬请期待。......
  • 一、变量
    Python-变量变量很好理解,就是一个会变得量,例如圆周率=3.1415926...如下代码pi=3.1415print(pi)执行输出后,它会打印出3.1415,我们来分析一下代码。变量的声明格式是变量名=变量值将右边的值赋给左边的变量名,其目的就是为了方便储存数据。text="这是一段文本......
  • 2 变量和基本类型
    编译器可能会做类型转换切勿混用带符号类型和无符号类型C++中初始化和赋值是两个完全不同的操作未初始化的变量含有一个不确定的值作用域是嵌套的全局变量不显示初始化会得到0,局部变量不可以不初始化,全局变量之间不要有初始化关联。不要返回本地变量的地址(本地变量的地址......
  • 机器人编程教程3探索Raspberry Pi
    3探索RaspberryPi本章将涉及以下主题:探索RaspberryPi的功能选择连接什么是RaspberryPiOS?为RaspberryPiOS准备SD卡3.1探索RaspberryPi的功能控制器将决定机器人的输入和输出类型、电子设备的功率要求、可使用的传感器类型以及运行的代码。更改控制器可能意......
  • PowerShell 使用SqlScriptDOM对T-SQL做规则校验
    ​ 对于数据项目来说,编写Sql是一项基本任务同时也是数量最多的代码。为了统一项目代码规范同时降低CodeReview的成本,因此需要通过自动化的方式来进行规则校验。由于本人所在的项目以SQLServer数据库为基础,于是本人决定通过使用SqlScriptDom类库来做T-SQL的规则校验。如果是其......