一些常用的Linux的Bash脚本:Grep过滤, ln软链接,iptables/firewall防火墙, read读取命令行输入,for循环,useradd新增帐号,awk一点学习实践

发布时间 2023-06-06 20:39:07作者: tomcat and jerry

# grep: 过滤

常用场景:举例:

查看java进程: ps -ef | grep java

选项    含义
-c    仅列出文件中包含模式的行数
-i    忽略模式中的字母大小写
-l    列出带有匹配行的文件名,不列出具体的匹配行
-n    列出所有的匹配行,并显示行号
-v    列出没有匹配模式的行,可以使用该选项,来排除关键字
-w    把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行(匹配整词)
-r    递归搜索

组合使用:找出java进程的进程ID

ps -ef | grep java | grep -v grep | awk '{print $2}'

 

# ln: 链接,快捷方式
常用场景:举例

创建一个文件夹的快捷方式

ln -s /usr/local/redis /home/yuxiaobin/

解释:将/usr/local/redis 目录在 /home/yuxiaobin/ 目录下建一个快捷方式,会在/home/yuxiaobin 目录下 有一个 redis的快捷方式

备注:

s 是软链接,
不加表示硬链接:如果源文件是一个文件,硬链接会复制一份文件
源文件是目录,会不支持硬链接

 

# iptables 防火墙1

# 查看端口开通情况
iptables -L -n 

# 临时添加端口
iptables -A INPUT -p tcp --dport 61616 -j ACCEPT

# 添加端口--重启有效
vi /etc/rc.d/init.d/iptables
service iptables restart

参考文档:https://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html

# firewall 防火墙2

#查看防火墙状态
firewall-cmd --state

#停止firewall
systemctl stop firewalld.service

#禁止firewall开机启动
systemctl disable firewalld.service

 

# Read读取命令行输入,并赋值给一个变量

#!/bin/bash
#模拟脚本拉取指定git分支
echo "Pls specify branchName:"
read

branch_name="master" #默认分支名称master

if [ $REPLY ]
then
  # echo "start to get code: $REPLY"
  branch_name=$REPLY
else
  echo "empty======= default is master"  
  #branch_name = "master"
fi

echo "branchName is $branch_name" #如果命令行输入了,那么这里就是输入的分支名称

git checkout $branch_name

 

# for循环处理

#!/bin/bash
for k in $(ls . | grep .sql | grep 11) #获取当前目录.下 名称包含 11 和 .sql的文件名称
do
    mv copy/$k copy/$k".bak"  #将当前目录的copy目录下的同名文件,重命名为.bak(即备份)
    cp $k copy/$k #将当前目录.下的 包含11 和 .sql的文件 复制一份到copy目录下(copy一份)
done
#1. 当前目录. 有 11.sql, 12.sql, 111.sql
#2. ls grep后,拿到 11.sql, 111.sql
#3. 先备份./copy下 11.sql->11.sql.bak, 111.sql->111.sql.bak
#4. 复制当前目录的11.sql, 111.sql 到./copy

 

# useradd

# useradd与adduser都是创建新的用户

# 在CentOs下useradd与adduser是没有区别的都是在创建用户,在home下自动创建目录,没有设置密码,需要使用passwd命令修改密码。



> useradd tomcat -U -m -s /bin/bash
> passwd tomcat  #这里会让你输入密码

 

# awk:强大的命令

# Linux AWK Learning Notes

https://earthly.dev/blog/awk-examples/

1. 打印整行数据
```
awk '{print $0}' 20211118.csv
```

$0:表示整行数据
$1: 表示按照分隔符分隔的第一个,相当于 String.split(",")[0]


2. 指定分隔符
默认分隔符是空格:包括blank,\t
```
awk '{print $1}' 20211118.csv

币种,往来单位,业务编号,三方号,销售,对账日期
USD,ABC有限公司,SN047,HDMUSHAZ37847400,TOMCAT
USD,ABC有限公司,SN047,HDMUSHAZ37847400,TOMCAT
USD,ABC有限公司,SN052,HDMUSHAZ05929300,TOMCAT
USD,ABC有限公司,SN052,HDMUSHAZ05929300,TOMCAT
USD,ABC有限公司,SN052,HDMUSHAZ05929300,TOMCAT
USD,ABC有限公司,SN052,HDMUSHAZ05929300,TOMCAT

```

csv文件 是通过 -F ',' 来分割
```
awk -F ',' '{print $1}' 20211118.csv
币种
USD
USD
USD
USD
USD
USD

```
-F ','  : 指定分隔符,默认awk以空格符(blank,\t)来分割 $1,$2



3. 列数(NF) 行数(NR)

NR: Number of Records/Rows  记录行数 total/NR 取平均

NF: Number of Fields in a record.  取一行记录的最后一列数据: $NF

```
awk -F ',' '{total = total+$8; print $NF} END {print NR}' 20211118.csv

对账日期  --$NF: 最后一列
2021-10
2021-10
2021-10
2021-10
2021-10
2021-10
7      --NR: 7行数

```


4. 正则过滤包含

打印包含The的行:

```
awk -F '\t' '/The/ { printf "%s \t %-20s \t %s \n", $15, substr($13,1,20), $8}' bookreviews.tsv  | head
```

/The/: 正则过滤包含 The 的行,相当于 | grep The

%-20s:指定该列打印的宽度20

精确匹配:
```
awk -F ',' '$7 == "海运费" {print $1,$2, $3,$7}' 20211118.csv

USD ABC有限公司 SN047 海运费
USD ABC有限公司 SN052 海运费

```

5. 定义变量,增加汇总

```
awk -F ',' '{total = total + $8; printf "%s \t %s  \t %-5s \t %s\n", $1, substr($2,1,2), $3, $NF} END {printf "total: %s \t average:%s \n", total, total/NR}' 20211118.csv

币种     往来    业务编号        对账日期
USD      AB    SN047     2021-10
USD      AB    SN047     2021-10
USD      AB    SN052     2021-10
USD      AB    SN052     2021-10
USD      AB    SN052     2021-10
USD      AB    SN052     2021-10
total: 25800     average:3685.71

```