参考linux 基础资料: linux基础
#sed参数: a 新增; c 替换; d 删除; i 插入; p 打印; s 取代
---------- 新增指定字符位置 ----------
cat -n xxx.txt # cat -n 查看文本并显示行号
grep 匹配
sed 修改文本
NR=$(cat -n /etc/httpd/conf/httpd.conf | grep "AddType application/x-gzip .gz .tgz" | awk -F" " '{print $1}' | sed "s/ //g")
# cat -n 查看文件内容并显示行号
# grep 匹配字符串所在行的整行内容
# awk -F" " 字段处理指定分隔符为空格,打印第一列;删除空格
echo "根据字符串查找的文本中的行号:"$NR
sed -i "$NR a\AddType application/x-httpd-php .php" /etc/httpd/conf/httpd.conf
# $NR a\ 根据查找到行号,的下一行插入字符串
# i\ 是上一行插入字符串
sed -i '/admin/i\1111\n 2222 \n 3333' passwd
# 前面增加多行内容
# \n 换行
sed -i '$a xxxx\n11111\n22222' 1.sh
# $最后一行,a 插入字符xxxx
# \n 换行,插入多行字符
sed -i G 1.txt # 每行后面增加空行
# 'G;G' 增加两行空行
echo -e " # -e 开启特殊字符转换:特殊字符不被解析。
\$ip # \ 特殊字符转译,写入的是变量名称,而不是变量的值
111
333
" >> 1.sh # 使用 echo 直接换行追加字符到文本
sed -i "s/^/https\:\/\/g" 1.txt
# 每行行首增加字符串 ^ 符号是行首; $ 符号是行尾
# "s/^/xxx/g" 其中s是修改,g是开启特殊字符转译,
# 符号 \ 指定需要转译 :// 符号不被解析
cat -n file.txt | grep "c$" # 匹配行尾是 c 的文件
sed -i "s/^[0-9]//g" 1.txt # 匹配开通是 0-9 的数字,替换为空格
sed -i '/./{s/^/eisc/;s/$/eisc/}' 1.txt
# 这是一个组合,行首与行尾都需要分别添加
---------- 删除指定字符位置的行 --------
sed -i "5,9d" 1.txt # 删除文件第5到9行
sed -i "/^f/d" txt.t # txt.t中以f开头的一行
# 符号 ^ 开头,不加 ^ 为包含有这个字符
# '/^\s*$/d' 删除所有空行
sed -i '/^[ \t]*$/d' 1.txt # 删除空格开头的空行
sed -i '/^$/d' test.txt # 删除空行
sed -i "s/#/ /g" 1.sh # 将开头为 # 符号的替换为空格
sed -i "s/^/#/g" 1.sh # 在每行开头添加#号
sed -i 's/[ ]*//g' test.txt # 剔除空格
sed -i "s/ //g" test.txt # 删除两个空格 为 空,一个空格不会被替换为空
s/[[:space:]]//g # 删除所有空格
's/[ \t]*$//g' # 删除行末空格
sed "s/[0-9]*$//g" # 删除末尾数字
A=$(sed -n '$=' 1.sh) ; sed -i $(($A-3+1)),${A}d 1.sh
# 删除最后三行
# sed -n 显示行号,$ 最后一行行号的数字
# $(($A-3+1)) 计算开始删除的行号位置
# ${A}d 最后一行,删除的结束位置
# 删除部分字符:使用下面的修改为空格即可
sed -i "s/\[/ /g" 1.txt
sed -i "s/\]/ /g" 1.txt
sed -i "s/>/ /g" 1.txt
sed -i '/[a-zA-Z]/d' 1.txt
# 删除字母的行
sed '101.200s/[a-zA-Z]//g' 1.txt
删除指定100到200行,取消为所有行
sed -i "s/\[/ /g" $folder/ipfw.txt;sed -i "s/\]/ /g" $folder/ipfw.txt ; sed -i "s/>/ /g" $folder/ipfw.txt ; sed -i '/[a-zA-Z]/d' $folder/ipfw.txt ; sed -i '/.../d' $folder/ipfw.txt ; sed -i '/:/d' $folder/ipfw.txt ; sed -i "/^$/d" $folder/ipfw.txt
# 清除文件特殊字符和空格
---------- 修改指定字符 ---------
#!/bin/bash
sed -i -e '1,5 s/^a.*/'======已修改aaaaa====='/g' \
# 1,5 1到5行, ^ 开头符号(开头为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
a=") " ; b="--"
sed -i "s/$a/$b/g" 1.sh # 替换特殊字符:将 ) 替换为 --
sed -i "s/\t/\n/g" 1.sh # 将 tab 替换为换行;
# \t : tab ; \n 换行; / / 空格
--------- 查看匹配字符所在行的所有字符串 ------
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#*c1*3} # 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中的$有点像
#!/bin/bash
direc=$(pwd)
for file in "$(direc)/*"
do
if [ "${file##*.}" = "sh" ]; then
xterm -e bash $file
elif [ "${file##*.}" = "bin" ]; then
xterm -e $file
elif [ "${file##*.}" = "run" ]; then
xterm -e $file
elif [ "${file##*.}" = "bundle" ]; then
xterm -e $file
elif [ "${file##*.}" = "pl" ]; then
xterm -e perl $file
elif [ "${file##*.}" = "class" ]; then
xterm -e java ${file%.*}
elif [ "${file##*.}" = "rpm" ]; then
xterm -e rpm -ivh $file
elif [ "${file##*.}" = "rb" ]; then
xterm -e ruby $file
elif [ "${file##*.}" = "py" ]; then
xterm -e python $file
elif [ "${file##*.}" = "jar" ]; then
xterm -e java -jar $file
fi
done
OLDIFS=$IFS
IFS=:
for path in $( find $direc -type d -printf "%p$IFS")
do
for file in `ls $path`
do
if [ "${file##*.}" = "sh" ]; then
xterm -e bash """"$path"/"$file""""
elif [ "${file##*.}" = "bin" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "run" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "bundle" ]; then
xterm -e """"$path"/"$file""""
elif [ "${file##*.}" = "pl" ]; then
xterm -e perl """"$path"/"$file""""
elif [ "${file##*.}" = "class" ]; then
xterm -e java """"$path"/"${file%.*}""""
elif [ "${file##*.}" = "rpm" ]; then
xterm -e rpm -ivh """"$path"/"$file""""
elif [ "${file##*.}" = "rb" ]; then
xterm -e ruby """"$path"/"$file""""
elif [ "${file##*.}" = "py" ]; then
xterm -e python """"$path"/"$file""""
elif [ "${file##*.}" = "jar" ]; then
xterm -e java -jar """"$path"/"$file""""
fi
done
done
IFS=$OLDIFS
19.复制一个目录下所有的文件到另一个目录
#!/bin/bash
direc="%%1" $(pwd)
for file in "$direc/*"
do
cp "$file" "%%1"
done
20.提取扩展名
#!/bin/sh
%%2=${%%1##.}
21.提取文件名
#!/bin/sh
%%2="$(basename %%1)"
22.提取文件路径
#!/bin/sh
%%2="$(dirname %%1)"
23.替换扩展名
#!/bin/sh
%%3="$(basename %%1)$%%2"
24.追加路径
#!/bin/sh
%%3="$(dirname %%1)/$%%2"
26.移动一个目录下所有文件到另一个目录
#!/bin/bash
direc="%%1" #$(pwd)
OLDIFS=$IFS
IFS=:
for file in "$(direc)/*"
do
mv "$file" "%%1"
done
IFS=$OLDIFS
27.指定目录下搜索文件
#!/bin/sh
find -name "%%1"
28.打开文件对话框
#!/bin/sh
%%1="$(Xdialog --fselect '~/' 0 0 2>&1)"
29.文件分割
#!/bin/sh
split -b 2k "%%1"
while read f1 f2 f3
do
echo $f1 >> f1
echo $f2 >> f2
echo $f3 >> f3
done
#!/bin/bash
linenum=`wc -l httperr8007.log| awk '{print $1}'`
n1=1
file=1
while [ $n1 -lt $linenum ]
do
n2=`expr $n1 + 999`
sed -n "${n1}, ${n2}p" httperr8007.log > file_$file.log
n1=`expr $n2 + 1`
file=`expr $file + 1`
done
其中httperr8007.log为你想分割的大文件,file_$file.log 为分割后的文件,最后为file_1.log,file_2.log,file_3.log……,分割完后的每个文件只有1000行(参数可以自己设置)
split 参数:
-b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分割;
#按每个文件1000行来分割除
split -l 1000 httperr8007.log httperr
httpaa,httpab,httpac ........
#按照每个文件100K来分割
split -b 100k httperr8007.log http
httpaa,httpab,httpac ........
#!/bin/bash
if [ $# -ne 2 ]; then
echo 'Usage: split file size(in bytes)'
exit
fi
file=$1
size=$2
if [ ! -f $file ]; then
echo "$file doesn't exist"
exit
fi
#TODO: test if $size is a valid integer
filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize
let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
let pieces=$pieces+1
fi
echo pieces: $pieces
i=0
while [ $i -lt $pieces ];
do
echo split: $file.$i:
dd if=$file of=$file.$i bs=$size count=1 skip=$i
let i=$i+1
done
echo "#!/bin/bash" > merge
echo "i=0" >> merge
echo "while [ $i -lt $pieces ];" >> merge
echo "do" >> merge
echo " echo merge: $file.$i" >> merge
echo " if [ ! -f $file.$i ]; then" >> merge
echo " echo merge: $file.$i missed" >> merge
echo " rm -f $file.merged" >> merge
echo " exit" >> merge
echo " fi" >> merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge
echo " let i=$i+1" >> merge
echo "done" >> merge
chmod u+x merge'
30.文件合并
#!/bin/sh
cp "%%1"+"%%2" "%%3"
exec 3<f1
exec 4<f2
while read f1 <&3 && read f2 <&4
do
echo $f1 $f2 >> join.txt
done
#!/bin/bash
if [ $# -ne 2 ]; then
echo 'Usage: split file size(in bytes)'
exit
fi
file=$1
size=$2
if [ ! -f $file ]; then
echo "$file doesn't exist"
exit
fi
#TODO: test if $size is a valid integer
filesize=`/bin/ls -l $file | awk '{print $5}'`
echo filesize: $filesize
let pieces=$filesize/$size
let remain=$filesize-$pieces*$size
if [ $remain -gt 0 ]; then
let pieces=$pieces+1
fi
echo pieces: $pieces
i=0
while [ $i -lt $pieces ];
do
echo split: $file.$i:
dd if=$file of=$file.$i bs=$size count=1 skip=$i
let i=$i+1
done
echo "#!/bin/bash" > merge
echo "i=0" >> merge
echo "while [ $i -lt $pieces ];" >> merge
echo "do" >> merge
echo " echo merge: $file.$i" >> merge
echo " if [ ! -f $file.$i ]; then" >> merge
echo " echo merge: $file.$i missed" >> merge
echo " rm -f $file.merged" >> merge
echo " exit" >> merge
echo " fi" >> merge
echo " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge
echo " let i=$i+1" >> merge
echo "done" >> merge
chmod u+x merge'
31.文件简单加密
#!/bin/bash
#make test && make strings && sudo make install
shc -r -f %%1.sh
#%%1.x
#%%1.x.c
32.文件简单解密
#!/bin/bash
#make test && make strings && sudo make install
shc -r -f %%1.sh
#%%1.x
#%%1.x.c
33.读取ini文件属性
#!/bin/bash
if [ "$%%3" = "" ];then
sed -n "/
$
/,/
.∗
/{
/^
.∗
/d
/^[ ]*$/d
s/;.*$//
p
}" $1
elif [ "$%%4" = "" ];then
sed -n "/
$
/,/
.∗
/{
/^
.∗
/d
/^[ ]*$/d
s/;.*$//
s/^[ | ]*$%%3[ | ]*=[ | ]*.∗[ | ]*/\1/p
}" $1
else
if [ "$%%4" = "#" ];then
sed "/
$
/,/
.∗
/{
s/^[ | ]*$%%3[ | ]*=.*/ /
}p" $1 > /tmp/sed
mv/tmp/sed
$1
else
sed "/
$2
/,/
.∗
/{
s/^[ | ]*$%%3[ | ]*=.*/$%%3=$%%4/
}p" $1 > /tmp/sed
mv/tmp/sed
$%%1
fi
fi
34.合并一个文件下所有的文件
#!/bin/sh
cat $(ls |grep -E '%%1\.') > %%1
#!/bin/bash
OLDIFS=$IFS
IFS=:
for path in $( find %%1 -type d -printf "%p$IFS")
do
for file in $path/*.c $path/*.cpp
do
if [[ ! "$file" =~ \*.[A-Za-z]+ ]]; then
#"$(path)/$(file)"
fi
done
done
IFS=$OLDIFS
#!/bin/bash
cat <<'EOF'> combine.c
#include
int main()
{
FILE *f1,*f2,*f3;
f1=fopen("a1.txt","r");
f2=fopen("a2.txt","r");
f3=fopen("a3.txt","w");
int a,b;
a=getw(f1); /*从a1.txt和a2.txt中分别取最小的数a和b*/
b=getw(f2);
while(!feof(f1)&&!feof(f2)) /*两个文件都没结束时,执行循环、比较*/
{
if(a<=b)
{
putw(a,f3);
a=getw(f1);
}
else
{putw(b,f3);
b=getw(f2);
}
}
if(feof(f1)) /*文件a1.txt结束时,把a2.txt中的数全部输入a3.txt*/
{putw(b,f3);
while((b=getw(f2))!=EOF)
putw(b,f3);
}
if(feof(f2)) /*同上*/
{
putw(a,f3);
while((a=getw(f1))!=EOF)
putw(a,f3);
}
fclose(f1);
fclose(f2);
fclose(f3);
printf("已完成!");
return 0;
}
EOF
gcc -o combine combine.c
if [ $? -eq 0 ]; then
./combine
else
echo 'Compile ERROR'
fi
35.写入ini文件属性
#!/bin/bash
if [ "$%%3" = "" ];then
sed -n "/
$
/,/
.∗
/{
/^
.∗
/d
/^[ ]*$/d
s/;.*$//
p
}" $1
elif [ "$%%4" = "" ];then
sed -n "/
$
/,/
.∗
/{
/^
.∗
/d
/^[ ]*$/d
s/;.*$//
s/^[ | ]*$%%3[ | ]*=[ | ]*.∗[ | ]*/\1/p
}" $1
else
if [ "$%%4" = "#" ];then
sed "/
$
/,/
.∗
/{
s/^[ | ]*$%%3[ | ]*=.*/ /
}p" $1 > /tmp/sed
mv/tmp/sed
$%%1
else
sed "/
$
/,/
.∗
/{
s/^[ | ]*$%%3[ | ]*=.*/$%%3=$%%4/
}p" $1 > /tmp/sed
mv/tmp/sed
$%%1
fi
fi
36.获得当前路径
#!/bin/sh
%%1=$(pwd)
37.读取XML数据库
如何通过shell命令行读取xml文件中某个属性所对应的值?
例如:
BuildVersion 5
我希望能够通过Unix shell命令对属性键的名称BuildVersion进行查询,返回的结果是5,如何实现呀?
#!/bin/bash
grep BuildVersion|sed 's/.*<.*>[<].∗<.*>.*/\1/'
结果返回的是“BuildVersion”,而不是“5”,如果要查询BuildVersion自动返回数值5应当如何写?
应该没错的。试一下: echo "BuildVersion 5"|grep BuildVersion|sed 's/.*<.*>[<].∗<.*>.*/\1/'我在SL的终端里试,返回值是5
目前需要从xml文件提取数据,想做一个xmlparser.sh
xml 类似这样
希望输入 xmlparser.sh a.xml hostip可以返回192.168.0.1
#!/bin/sh
if [ $# -ne 2 ];then
echo "Usage: $0 "
exit 0
fi
grep $2 $1|awk '{print $2}'|grep -o "[0-9.]*"
把
grep $2 $1|awk '{print $2}'|grep -o "[0-9.]*"
改成
grep $2 $1|awk '{print $2}'|grep -Eo "[0-9.]+"
楼上这个有问题,如果我要得到的是
中的sharename,那么,呵呵,就错了
我觉得应该先定位到第二个参数“$2”的位置,然后再提取“=”后面的内容
这里有个完整的实现:
Parse Simple XML Files using Bash – Extract Name Value Pairs and Attributes
http://www.humbug.in/2010/parse-simple-xml-files-using-bash-extract-name-value-pairs-and-attributes/
不过需要安装xmllint.
设计到对多个xml文件进行element的读取和列表。有人做过么?
举个例子,
多个xml文件里面都有
<f1
<f2
相关资料:
Powered by ddoss.cn 12.0
©2015 - 2025 ddoss
渝公网安备50011302222260号
渝ICP备2024035333号
【实验平台安全承诺书】
小绿叶技术社区,优化网络中,点击查看配置信息
主机监控系统: 安全防火墙已开启检查cc攻击-下载文件完成后等待10s 恢复访问,检查连接数低于峰值恢复访问
您的IP:216.73.216.110,2025-12-01 15:19:00,Processed in 0.01092 second(s).