收藏文章 楼主

shell sed 增删改查-文件操作大全

版块:shell   类型:精华/置顶   作者:小绿叶技术博客   查看:4069   回复:0   获赞:3   时间:2019-10-30 17:18:39

参考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



相关资料:

Linux的Shell--Sed操作(指定行增加删除内容)




本文章最后由 admin2024-08-08 16:49 编辑

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:shell sed 增删改查-文件操作大全

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息