printf '%s\t%s\t%s\n' 1 2 3 4 5 6
^[^a-z] 中括号内^代表取反
a* 匹配所有
aa*
添加IP地址与更换IP地址(远程登录是改不了的)
[root@localhost ~]# vim huan
#!/bin/bash
read -p "Do you want to add or replace IP [add/rep] : " ar
if [ -n $ar ]
then
case $ar in
"add")
read -p "please input your IP address: " ip
read -p "please input your NETMASK : " net
read -p "please input your GATEWAY : " gat
read -p "please input your DNS : " dns
if [ -n $ip -a -n $net -a -n $gat -a -n $dns ]
then
sed "4s/dhcp/static/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "6s/no/yes/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "15s/no/yes/g" /etc/sysconfig/network-scripts/ifcfg-ens33
echo "IPADDR=$ip" >> /etc/sysconfig/network-scripts/ifcfg-ens33
echo "NETMASK=$net" >> /etc/sysconfig/network-scripts/ifcfg-ens33
echo "GATEWAY=$gat" >> /etc/sysconfig/network-scripts/ifcfg-ens33
echo "DNS1=$dns" >> /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network
fi
;;
"rep")
t=$( cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "IPADDR" |cut -f 2 -d "=" )
u=$( cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "NETMASK" |cut -f 2 -d "=" )
v=$( cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "GATEWAY" |cut -f 2 -d "=" )
w=$( cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "DNS1" |cut -f 2 -d "=" )
read -p "please input your IP address: " i
read -p "please input your NETMASK : " n
read -p "please input your GATEWAY : " g
read -p "please input your DNS : " d
if [ -n $i -a -n $n -a -n $g -a -n $d ]
then
sed "4s/dhcp/static/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "6s/no/yes/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "15s/no/yes/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "17s/IPADDR=$t/IPADDR=$i/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "18s/NETMASK=$u/NETMASK=$n/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "19s/GATEWAY=$v/GATEWAY=$g/g" /etc/sysconfig/network-scripts/ifcfg-ens33
sed "20s/DNS1=$w/GATEWAY=$d/g" /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl restart network
fi
;;
*)
echo "Your input is wrong"
;;
esac
fi
chmod 755 huan
[root@localhost ~]# vim userdel.sh
#!/bin/bash
read -p "please you input yes or no delete anyuser [y/n] : " yn
read -p "please you input delete number : " num
if [ -n $yn ]
then
case $yn in
"y")
touch name
cat /etc/passwd | grep "/bin/bash" | grep -v "root" | cut -d ":" -f 1 >> name
for i in $( cat name )
do
a=0
for (( a=0;a<=$num;a=a+1 ))
do
userdel $i
done
done
rm -rf name
;;
"n")
echo "[root@localhost ~]# "
;;
*)
echo "no have it"
;;
esac
fi
[root@localhost ~]# chmod 755 userdel.sh
cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" |cut -f 2 -d "="
#提取IP地址、子网掩码、网关、dns
cat /etc/sysconfig/network-scripts/ifcfg-ens33 | grep "IPADDR" |cut -f 2 -d "="
#提取IP地址
grep “a*” test.txt
匹配多个a或者0个a的行
#!/bin/bash
df -h | grep "/dev/vda1" | awk '{printf $5 "\n"}' | cut -f 1 -d "%"
awk 'END{print "test"}{printf $2 "\n"}' student.txt
echo "指定分隔符"
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"}{printf $1 "\t" $3 "\n"}'
echo "根据条件筛选"
cat student.txt | grep -v "Name" | awk '$4>40{print $2}'
awk 语法:
默认使用tab或者空格分割
awk 有内置的一些函数可以调用 比如substr
awk 也可以将正则作为条件,比如
awk '/in/ {printf $2 "\n"}' student.txt
ID Name gender mark
1 geek F 89
2 jin F 70
3 xin F 45
#!/bin/bash cut -f 2,4 student.txt
cut 用来提取列
-d 默认分隔符为tab
字符处理命令
etc/passwd 为当前保存的用户信息
sort
不给参数按照行的字母顺序排列,默认分隔符为tab
-r 取反
echo "指定分隔符是: 用第三个字段开头 第三个字段结尾排序 就是只用第三个字段排序 使用数字进行排序"
echo "对每行用冒号分割(-t)后的字段的第三个列用数字(-n)的方式进行排序 "
sort -n -t ":" -k 3,3 /ect/passwd
wc 是的缩写word count
-l 只统计行数
-w 只统计单词数
-m 只统计字符数
sed 主要用来修改文档数据
echo "删除第二行"
sed '2d' student.txt
echo "删除第二行到第四行"
sed '2,4d' student.txt
echo "删除第二行后追加字符串 a为append"
sed '2a geek v5' student.txt
echo "删除第二行前插入字符串 i 为insert"
sed '2i geek v5' student.txt
echo "替换整行"
sed '2c geek v5' student.txt
echo "替换行中的字符串 显示到屏幕 但不会改变文件的内容"
sed '3s/28/70/g' student.txt
echo "替换行中的字符串 不显示到屏幕 且会改变文件的内容 -i会改变文件内容"
sed -i '3s/28/70/g' student.txt
echo "多个动作同时执行 不加行号 搜索所有文件内容 70 置空 xin替换成hui"
sed -e 's/70//g;s/xin/hui/g' student.txt
定义:sed 是一种轻量级流编辑器,是Stream EDitor的缩写
作用:sed 替换字符串内容 对数据进行选取 替换 删除 新增
格式:sed [选项] '[动作]' 文件名
选项:-n 一般sed命令会把所有的数据都输出到屏幕,如果加入此选择
则只会把经过sed命令处理的行输出到屏幕
-e 允许对输入数据应用多条sed命令编辑
-i 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a 追加,在当前行后添加一行或者多行
c 行替换,用c后面的字符替换原数据行
i 插入,在当前行前插入一行或多行
d 删除,删除指定的行
p 打印,输出指定的行
s 字符替换,用一个字符串替换另一个字符串。格式为”行范围s/旧字符串/新字符串/g“(和vim中的替换格式类似)
条件 动作
awk 默认使用空格或者tab键作为分隔符
使用{FS=":"}指定分隔符
cat stu.txt | printf 这种执行不成功
管道运算符返回的是数据流 而printf只认识字符串
可以用 printf‘%s\t%s\t%s\t%s\t\n’$(cat stu.txt ) 实现对文件内容的打印
某种意义上 printf是awk的子命令
awk 一行行的读取文件里的内容 文件为$0 第一列(字段)为$1 第二列(字段)为$2
统计命令 wc
wc [选项] 文件名
选项
-l:只统计行数
-w:只统计单词数
-m:只统计字符数
sort -t ":" -k 3,3 /etc/passwd # 指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序
sort -n -t ":" -k 3,3 /etc/passwd
排序命令 sort
sort [选项] 文件名
选项
-f:忽略大小写
-n:以数值型进行排序,默认使用字符型排序
-r:反向排序
-t:指定分隔符,默认分隔符是制表符
-k n[,m]:按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)
字符处理命令
sort 命令
wc 命令
字符串替换
sed 's/旧字串/新字串/g' 文件名
sed '3s/60/99/g' student.txt # 在第三行中,把 60 换成 99 sed -i '3s/60/99/g' student.txt # sed 操作的数据直接写入文件
sed -e 's/fengj//g;s/cang//g'student.txt 同时把“fengj”和“cang“替换为空
sed '2c furong bu ji ge' student.txt # 数据替换
sed '2a piaoliang jiushi renxing' student.txt # 在第二行后追加 hello
sed '2i meinv' student.txt # 在第二行前插入两行数据
sed '2,4d' student.txt # 删除第二行到第四行的数据,但不修改文件本身
行数据操作
sed '2p' student.txt # 查看文件的第二行 sed -n '2p' student.txt
END
awk 'END{printf "The End \n"} {printf $2 "\t" $4 "\n"}' student.txt
BEGIN
awk 'BEGIN{printf "This is a transcript \n"} {printf $2 "\t" $4 "\n"}' student.txt