grep : 文本搜索
find :文本查找
locate:(updatedb 手動生產)
1.依賴於數據庫 2.非實時查找,結果非精確 3.查找速度快 4.采用的模糊查找
find:
實時查找:速度慢 精確匹配
格式:
find [options] [查找路徑] [查找條件] [處理動作]
查找路徑:默認為當前目錄
查找條件:默認為查找指定路徑下的所有文件
處理動作:默認為顯示
查找條件:
-name “文件名稱”:支持使用globbing(文件通配)
-iname "文件名稱" : 根據姓名查找文件,不區分大小寫
-user UserName :根據屬主查找
-group GroupName : 根據屬組查找
-nouser:查找沒有屬主的文件
-nogroup: 查找沒有屬組的文件
-type: 根據文件類型查找
f: 普通文件
d: 目錄
b: 塊設備
c: 字符設備
l: 符號鏈接文件
p: 命令管道
s: 套節子
-szie:根據文件大小查找
格式: -size[+|-]#Unit
#:(#-1)根據時間撮查找:
以天為單位(time):
-atime [+|-]#
-mtime
-ctime
-: 剛好#
+: >#
以分鐘為單位
-amin
-mmin
-cmin
根據權限查找:
-perm [+|-] MODE
MODE : 精確匹配
+ MODE:任何一類用戶的任何一位權限匹配 (常用於查找某類的某特定權限是否存在)
- MODE:每類用戶的指定要檢查的權限位都匹配
文件通配:
*:表示任意長度的任意字符
?:表示任意的單個字符
[] : 表示在指定范圍內的單個字符:[a-z]
[^]:脫字符,取反的意思
組合條件:
-a :與。同事滿足
-o : 或,一個滿足
-not , !非。取反
練習:
1.查找/var目錄中屬主為root且屬組為mail的文件
find /var/ -user root -group mail
2.查找/usr目錄下不屬於root、bin或 hadoop的所有文件
find /usr/ -not -user root -not -user bin -not -user hadoop
find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
3.查找/etc目錄中最近一周內其內容修改過的,且不屬於root或hadooop的文件
find /etc -mtime -7 -not -user root -not -user hadoop
4.查找當前系統上沒有屬組或屬組,且最近一個月內被訪問過的文件
find / \(-nouser -o -nogroup\) -atime -30
5.查找早/etc/目錄下大於1M且類型為普通文件的所有文件
find /etc/ -type f -size +1M
6.查找/etc/目錄所有用戶都沒有寫權限的文件
find /etc/ -not -perm +222
所有都沒有;相反:任何一個有
所有都有:相反:只要有一個沒有
7.查找/etc/目錄下至少一類沒有寫權限的文件
find /etc/ -perm -222
8.查找/etc/init.d目錄下,所有用戶都有執行權限其其他用戶有寫權限的文件
find /etc/init.d/ -perm -111 -perm -002
find /etc/init.d/ -perm -113
Linux任務計劃
一次性任務執行:
at:
1.交互式 讓用戶在at>提示符輸入多個要執行命令
格式:at time
atq =at -L 查看作業
-q 字母 TIme 添加別的隊列
at -d job_name 刪除一個尚未執行的作業= atrm
Ctrl+d :提價任務
at 作業有隊列:使用單個字符表示
2.批處理:將任務的各命令寫入文件由at進行調用
at批模式:
at -f 文件路徑 TIME
TIME:
模糊時間:
now
noon(中午)
midnight(午夜)
teatime(下午4點)
tomorrow
任務的執行結果會議郵件的形式發送給提交者
使用mail
-s 指定主題
mail -s 主題 用戶
mail 用戶名
主題
內容
可以通過系統文件當作內容 或者用ehco
echo -e "hello are you " | mail -s "to" root
cat /etc/passwd | mail -s "ss" root
batch:不能指定時間,它自動選擇系統空閒時執行
crond:守護進程,運行在後台,隨時監視著進程等待執行
服務進程:阻塞,輪訓
周期性任務執行
系統cron:
文件: /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
時間表示法:
1.每個時間位都應該使用其可用的有效取值范圍內的值
2.某時間位上的*表示對應位的所有有效取值
3. -:連續的相鄰時間點取值
4. ,:離散的時間點取值
5. /# :表示在指定時間范圍內每隔#一次 5-45/3 5到45分鐘,每3分鐘執行一次
注意: 通過輸出重定向而拒收郵件
&> /dev/null 錯誤
> /dev/null 2>/文件位置 成功的到/dev/null 成功到指定位置
用戶cron:
文件: /var/spool/sron/UserName
使用crontab命令來實現
-l:查看自己的cron任務列表
-e:通過EDITOR變量中定義的編輯器打開用戶自己的cron配置文件:
編輯單獨的任務都使用-e選項,無論是刪除、修改還是新建
-r:移除crontab文件
如果是管理員
-u UserName: 為別的用戶指定crontab作業
#crontab -e -u 用戶名
提醒:如果在conrtab的用戶命令中使用%,得轉義為\%
anacron
練習
1、每3分鐘執行一個“echo “how are you?””
*/3 * * * * /bin/echo "hao are you"
2、每周2、4、6備份/etc/目錄至/backup目錄中,備份的文件名以當etc_開頭並跟上當日的日期作為文件名
3 2 * * 2,4,6 /bin/tar -Jcf /backup/etc_`data '+/%F'.tar.xz ` /etc/*
3.每天6,9,12,15,18查看一下系統當前掛載的所有文件系統,並將查看的結果追加至/tmp/mounts.txt文件中
3 6,9,12,15,18 * * * * * /bin/mount>>/tmp/mounts.txt
4.每天每兩小時取當前系統內存空間余量,將其保存至/stats/memory.txt文件中
34 */2 * * * /bin/grep "^MemFree:" /proc/meminfo >> /status/memory.txt
如何實現秒級別的任務
* * * * * * /bin/echo "how are your"; sleep 30; /bin/echo "how are you"
crontab文件的格式
空白行會被忽略
#開頭的行是注釋
anacron:
1. 是crontab的補充,用於檢查crontab中某任務在過去的一個周期內是否沒有執行,
2. 如果沒有執行,則在開機以後的某時間點讓其執行一次,無論其周期是否到達
facl:文件訪問控制列表
普通用戶無法安全地將某文件授權給其他用戶訪問
facl:
附加原有權限模型之上另一層權限控制機制,保存至文件擴展屬性信息中
命令:
getfacel file...
setfacel {-x|-m} 權限 file...
-m:設定權限
-m u:UserName:Perms
-m g:GroupName:Perms
-m m::Perms
-x:取消權限
-x u:UserName
-x g:GroupName
-x m:
ll表示為+,有額外的權限屬性
-R:遞歸,對文件夾內的文件也生效
bash編程之循環控制
for varName in List; do
循環體
done
while CONDITION; do
循環體
done
循環控制
continue:提前結束本次循環而開始評估下一輪
break [n]:結束當前循環,指定條吹幾次循環
shell練習
練習:求100以內所有偶數之和
#!/bin/bash
declare -i sum=0
declare -i i=1
while [ $i -le 100 ];do
if [ [ $i%2 ] -eq 0 ];then
let sum+=$i
fi
let i++
done
寫一個腳本
1.讓用戶輸入一個塊設備,如果設備文件不存在,就提示用戶重新輸入,知道用戶輸入正確
2.用戶可以輸入quit退出
#!/bin/bash
#
while true; do
read -p "Enter a dev " devdir
if [ "$devdir" == "quit" ];then
break
fi
if [ -b $devdir ];then
break
else
echo "wrong device file"
fi
done
擴展前一題
1,顯示用戶輸入塊設備,並提示用戶,後續操作會損壞設備上的所有文件,讓用戶選擇是否選擇
2.如果用戶輸入y。則繼續後面的操作
3.如果用戶輸入n ,則顯示用戶選擇了終止,並退出腳本
4.輸入任何其他字符,則用戶重新選擇
#!/bin/bash
#
while true; do
read -p "Enter a dev " devdir
if [ "$devdir" == "quit" ];then
break
fi
if [ -b $devdir ];then
echo "$devdir is very good !"
read -p "Are you suer [y|b]" devop
devop=echo $devop | tr 'A-Z' 'a-z'
if [[ "$devop" == "y" ]];then
echo "no xuanze le yes"
elif [[ "$devop" == "n" ]];then
break
else
continue
fi
else
echo "wrong device file"
fi
done
練習:寫一個腳本
1.提示用戶輸入一個目錄路徑
2,顯示目錄下至少包含一個大寫字母的文件名
#!/bin/bash
while true;do
read -p "Enter a directory: " dirname
[ "$dirname" == "quit" ] && exit 3
[ -d "$dirname" ] && break || echo "wrong directory..."
done
for filename in $dirname/*;do
if [[ "$fileName" =~ .*[[:upper:]]{1,}.* ]]; then
echo "$fileName"
fi
done
練習:寫一個腳本
前提:配置好yum源
1、如果本機沒有一個可用的yum源,則提示用戶,並退出腳本(4);如果此腳本非以root用戶執行,則顯示僅有root才有權限安裝程序包,而後退出(3);
2、提示用戶輸入一個程序包名稱,而後使用yum自動安裝之;盡可能不輸出yum命令執行中的信息;
如果安裝成功,則綠色顯示,否則,紅色顯示失敗;
3、如果用戶輸入的程序包不存在,則顯示錯誤後讓用戶繼續輸入;
4、如果用戶輸入quit,則正常退出(0);
5、正常退出前,顯示本地共安裝的程序包的個數;
#!/bin/bash
while true;do
if [ $UID -ne 0 ]; then
echo "`basename $0` must be running as root"
exit 3
fi
yum repolist &> /dev/null
if [[ $? -eq 0 ]];then
while true;do
read -p "Enter a chengxubao: " baoname
if [[ "$baoname" == "quit" ]];then
rpm -qa |wc -l
exit 0
fi
yum list |grep "^$baoname.*" &> /dev/null
if [[ $? -eq 0 ]];then
yum install $baoname -y &> /dev/null
if [[ $? -ne 0 ]];then
echo "$baoname not ok"
else
echo "$baoname is ok!"
exit 0
fi
else
continue
fi
done
else
echo "yum is not ok!!"
exit 4
fi
done