增删改查 字符串
#sed参数: a 新增; c 替换; d 删除; i 插入; p 打印; s 取代
---------- 新增指定字符位置 ----------
sed -i '/admin/axxxxxxx' passwd
# 指定位置的后面增加一行内容为:xxxxxx
# passwd 是文件
# 使用符号 \ 进行转译特殊字符
# 网址中的 http:// 转译为: http:/\/\
sed -i '/admin/i1111n 2222 n 3333' passwd
# 前面增加多行内容
# \n 换行
sed -i '$a xxxxn11111n22222' 1.sh
# $最后一行,a 插入字符xxxx
# \n 换行,插入多行字符
sed -i G 1.txt # 每行后面增加空行
# 'G;G' 增加两行空行
echo "
111
333
" >> 1.sh # 使用 echo 直接换行追加字符到文本
sed -i "s/^/https://g" 1.txt
# 每行行首增加字符串 ^ 符号是行首; $ 符号是行尾
# "s/^/xxx/g" 其中s是修改,g是开启特殊字符转译,
# 符号 \ 指定需要转译 :// 符号不被解析
sed -i '/./{s/^/eisc/;s/$/eisc/}' 1.txt
# 这是一个组合,行首与行尾都需要分别添加
---------- 删除指定字符位置的行 --------
sed -i "/^f/d" txt.t # txt.t中以f开头的一行
# 符号 ^ 开头,不加 ^ 为包含有这个字符
# '/^\s*$/d' 删除所有空行
sed -i '/^$/d' test.txt # 删除空行
sed -i 's/[ ]*//g' test.txt # 剔除空格
s/[[:space:]]//g # 删除所有空格
's/[ \t]*$//g' # 删除行末空格
A=$(sed -n '$=' 1.sh) ; sed -i $(($A-3+1)),${A}d 1.sh
# 删除最后三行
# sed -n 显示行号,$ 最后一行行号的数字
# $(($A-3+1)) 计算开始删除的行号位置
# ${A}d 最后一行,删除的结束位置
# 删除部分字符:使用下面的修改为空格即可
---------- 修改指定字符 ---------
!/bin/bash
sed -i -e 's/^a.*/'======已修改aaaaa====='/g' \
# -e 修改多个, ^ 开头符号(开头为a字符的) .* 后面的所有内容 \ 多行换行
-e 's/^b.*/'======已修改bbbbb====='/g' 3.txt
# 要操作的文件为:3.txt
sed -i "s/echo/xxx/g" grep "echo" -rl /root/1.sh
#"s/原字符串/新字符串/g"
# `grep "原字符串" -rl 所在目录`
# 当前是使用的双引号,xxx也可以是变量 $a
--------- 查看匹配字符所在行的所有字符串 ------
grep -r admin passwd |awk -F = '{print $0}'
# 在passwd 文件里面的 admin 字符所在的行
# awk 字段处理, $0 当前行的所有列(全部)
grep -v abc # grep 不匹配字符串
-------------------- 脚本操作文件 ----------------------------
!/bin/bash
aa="/root/d" # 定义变量为一个目录
for bb in $aa/* ; do # 将 aa 的值赋给 bb 继承
if [ -d $bb ]; then # if 判断 $bb 变量是目录,然后就:
# -d 目录
rm -rf $bb # 删除一个目录下所有的文件
fi # fi 结束
done
!/bin/bash
direc="/root/d" # 定义direc变量 的值为目录
for dir2del in $direc/* ; do
# dir2del in 是 变量$direc 的值
if [ -d $dir2del ]; then # 判断 $dir2del 是目录,然后就
rm -rf $dir2del # 清空文件夹
fi
done
!/bin/sh
cat "/root/1.txt" | while read line; do
# 查看文件内容,并将它赋值给变量 line
echo $line; # 以系统默认编码来打印
done
读取文件属性
if elif else
用来判断文件的参数:
-r 可读 -b块设备文件 -c 字符设备 -d 目录 -f 普通文件 -g SGID位 -k站着位stick bit
-p 管道 -u SUID -r 可读 -w 可写 -x 执行 -s 文件为空 -e 文件存在
逻辑判断:
相等 -eq 不相等 -ne 大于 -gt 大等于 -ge 小于 -lt 小等于 -le
非运算 ! 或运算 -o 与运算 -a
!/bin/bash
file=${file:?'必须给出参数'}
file=1.sh # 给变量赋值为一个文件
file=$file # 将参字符串赋值给变量
if [ ! -e $file ]; then # 判断 ! -e 不存在文件,然后就
echo "$file 不存在" # 打印字符串
exit 1 # 文件不存在就退出程序,不向下执行
fi # if 和 fi 开始与结束
if [ -d $file ]; then # 判断变量$file -d 是文件夹,然后就
echo "$file 是一个目录" # 打印字符串
if [ -x $file ]; then # 判断变量 -x 执行,然后就
echo "可以"
else
echo "不可以"
fi
echo "对此进行搜索" # echo 打印变量
elif [ -f $file ]; then # 循环语句 if elif else
# -f 是普通文件,然后就
echo "$file 是一个正规文件"
else # else 其他的情况
echo "$file不是一个正规文件"
fi
if [ -O $file ]; then # -O 用户组
echo "你是$file的拥有者"
else
echo "你不是$file的拥有者"
fi
if [ -r $file ]; then # -r 可读
echo "你对$file拥有"
else
echo "你并不对$file拥有"
fi
echo "可读权限" # 连接打印:上一条和本条信息顺序连在一起了
if [ -w $file ]; then # -w 可读
echo "你对$file拥有"
else
echo "你并不对$file拥有"
fi
echo "可写权限"
if [ -x $file -a ! -d $file ]; then # -x 可执行
echo "你拥有对$file"
else
echo "你并不拥有对$file"
fi
echo "可执行的权限"
写入文件属性
通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。
chattr [-RV] [-+=AacDdijsSu] [-v version] 文件或目录
-R:递归所有子目录 -V:详细显示修改内容
-:失效属性。 +:激活属性。
= :指定属性。 A:Atime 不要修改文件的最后访问时间
S:Sync 写到磁盘 a:Append Only,系统只允许追加数据
i:Immutable 不允许修改 D:检查压缩文件中的错误。
d:No dump 备份时忽略文件 C:Compress 系统以透明的方式压缩这个文件
S:Secure Delete 删除时用0填充 u:Undelete 删除这个文件,系统会保留其数据
chattr +i /etc/resolv.conf # +i 防止修改
lsattr /etc/resolv.conf # 查看文件属性
chattr +a /var/log/messages # +a只能追加数据
12.枚举一个目录中的所有文件夹
!/bin/bash
OLDIFS=$IFS
IFS=:
for path in $( find "%%1" -type d -printf "%p$IFS")
do
"$path"
done
IFS=$OLDIFS
14.复制一个目录下所有的文件夹到另一个目录下
!/bin/bash
direc="%%1" #$(pwd)
for dir2cp in $direc/* ; do
if [ -d $dir2cp ]; then
cp $dir2cp "%%2"
fi
done
16.移动一个目录下所有的文件夹到另一个目录下
!/bin/bash
direc="%%1" #$(pwd)
for dir2mv in $direc/* ; do
if [ -d $dir2mv ]; then
mv $dir2mv "%%2"
fi
done
17.以一个文件夹的框架在另一个目录下创建文件夹和空文件
!/bin/bash
direc="%%1" #$(pwd)
OLDIFS=$IFS
IFS=:
for path in $( find $direc -type d -printf "%p$IFS")
do
mkdir -p "%%2/${path:${#direc}+1}"
done
IFS=$OLDIFS
cp -a "%%1" "%%2"
表达式
1,取得字符串长度和位置
string=abc12342341 # 赋值一个变量
echo ${#string} # 响应变量的长度
expr length $string # 响应变量的长度
expr "$string" : ".*" # 结果11 字符串所在位置
expr index $string '1' # 结果4 字符串对应的下标是从0开始
2,字符串截取
echo ${string:4} # 从第4位开始截取后面所有字符串
echo ${string:3:3} # 从第3位开始截取后面3位
echo ${string:3:6} # 从第3位开始截取后面6位
echo ${string: -4} # :右边有空格 截取后4位
echo ${string:(-4)} # 同上后四位
expr substr $string 3 3 # 从第3位开始截取后面3位
6,截取不匹配的内容:去掉匹配到的内容
echo ${string#a*3} # 42341 从$string左边开始,去掉最短匹配子串
echo ${string#c*3} # abc12342341 这样什么也没有匹配到
echo ${string#c13} # 42341 从$string左边开始,去掉最短匹配子串
echo ${string##a*3} # 41 从$string左边开始,去掉最长匹配子串
echo ${string%3*1} # abc12342 从$string右边开始,去掉最短匹配子串
echo ${string%%3*1} # abc12 从$string右边开始
7,匹配并且替换
echo ${string/23/bb} # 将变量中的23 替换为 bb
echo ${string//23/bb} # 双斜杠替换所有匹配
echo ${string/#abc/bb} # #号以什么开头来匹配,根php中的^有点像
echo ${string/%41/bb} # %以什么结尾来匹配,根php中的$有点像