天天看點

shell 增删改查-檔案操作大全!/bin/bash!/bin/bash!/bin/bash!/bin/sh!/bin/bashfile=${file:?'必須給出參數'}!/bin/bash"$path"!/bin/bash!/bin/bash!/bin/bashcp -a "%%1" "%%2"

增删改查 字元串

#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 不比對字元串

-------------------- 腳本操作檔案 ----------------------------

aa="/root/d" # 定義變量為一個目錄

for bb in $aa/* ; do # 将 aa 的值賦給 bb 繼承

if [ -d $bb ]; then # if 判斷 $bb 變量是目錄,然後就:

# -d 目錄
           

rm -rf $bb # 删除一個目錄下所有的檔案

fi # fi 結束

done

direc="/root/d" # 定義direc變量 的值為目錄

for dir2del in $direc/* ; do

# dir2del in 是 變量$direc 的值
           

if [ -d $dir2del ]; then # 判斷 $dir2del 是目錄,然後就

rm -rf $dir2del # 清空檔案夾

fi

!/bin/sh

cat "/root/1.txt" | while read line; do

# 檢視檔案内容,并将它指派給變量 line
           

echo $line; # 以系統預設編碼來列印

讀取檔案屬性

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

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不是一個正規檔案"
           

if [ -O $file ]; then # -O 使用者組

echo "你是$file的擁有者"
           

else

echo "你不是$file的擁有者"
           

if [ -r $file ]; then # -r 可讀

echo "你對$file擁有"
           
echo "你并不對$file擁有"
           

echo "可讀權限" # 連接配接列印:上一條和本條資訊順序連在一起了

if [ -w $file ]; then # -w 可讀

echo "你對$file擁有"
           
echo "你并不對$file擁有"
           

echo "可寫權限"

if [ -x $file -a ! -d $file ]; then # -x 可執行

echo "你擁有對$file"
           
echo "你并不擁有對$file"
           

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.枚舉一個目錄中的所有檔案夾

OLDIFS=$IFS

IFS=:

for path in $( find "%%1" -type d -printf "%p$IFS")

do

"$path"

IFS=$OLDIFS

14.複制一個目錄下所有的檔案夾到另一個目錄下

direc="%%1" #$(pwd)

for dir2cp in $direc/* ; do

if [ -d $dir2cp ]; then

cp $dir2cp "%%2"

16.移動一個目錄下所有的檔案夾到另一個目錄下

for dir2mv in $direc/* ; do

if [ -d $dir2mv ]; then

mv $dir2mv "%%2"

17.以一個檔案夾的架構在另一個目錄下建立檔案夾和空檔案

for path in $( find $direc -type d -printf "%p$IFS")

mkdir -p "%%2/${path:${#direc}+1}"

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中的$有點像