第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Shell常用工具

Linux中有很多非常實(shí)用的工具或命令,靈活運(yùn)用這些工具,可以幫助我們在Shell編程中化繁為簡,如虎添翼??赡芤粋€(gè)工具或命令就能讓原本負(fù)責(zé)的問題快速解決,本章節(jié)我們來一起豐富我們的工具庫,日常可以多積累總結(jié),幫助我們更好的編寫Shell。

1. sort

簡介:顧名思義,就是用來排序的工具,在我們?nèi)粘9ぷ髦袑τ谥貜?fù)列的多行輸出,如果想要對內(nèi)容按照特定規(guī)則排序,此時(shí)就用到了sort工具。

原理:sort 將文件的每一行作為一個(gè)單位,相互比較,比較原則默認(rèn)情況是從首字符向后,依次按 ASCII 碼值進(jìn)行比較, 后將他們按升序輸出。

語法sort [OPTION]... [FILE]…

選項(xiàng)說明

  • -t:指定以什么作為列分割
  • -k:用來制定利用那列進(jìn)行排序,通常-t-k配合使用
  • -r:將文本文件降序輸出
  • -n:以數(shù)組來進(jìn)行生序排序
  • -f:忽略大小寫字母
  • -u:取消重復(fù)的行

在此我們不全部展開起所有選項(xiàng),只根據(jù)日常經(jīng)驗(yàn)結(jié)合實(shí)際案例列舉最常用的選項(xiàng)進(jìn)行說明。

實(shí)例

  • 對/etc/passwd中以uid從大到小排序
[root@10-234-1-235 ~]# sort -t: -k3 -n -r /etc/passwd
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
gitlab-www:x:498:497::/var/opt/gitlab/nginx:/bin/false
git:x:497:496::/var/opt/gitlab:/bin/sh
gitlab-redis:x:496:495::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:495:494::/var/opt/gitlab/postgresql:/bin/sh
gitlab-prometheus:x:494:493::/var/opt/gitlab/prometheus:/bin/sh
mongod:x:493:492:mongod:/var/lib/mongo:/bin/false
nobody:x:99:99:Nobody:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

通過上例可以看到,利用-t選項(xiàng)指定/etc/passwd文件中,以:作為列進(jìn)行分割,指定uid的列為k3,-n以數(shù)字進(jìn)行排序,-r為倒序排序輸出。

2. uniq

簡介:對于一些重復(fù)輸出的行進(jìn)行去重。

語法uniq [OPTION]... [INPUT [OUTPUT]]

選項(xiàng)說明

  • -c: 打印出現(xiàn)的次數(shù),只能統(tǒng)計(jì)相鄰的;
  • -d: 只打印重復(fù)行;
  • -u: 只打印不重復(fù)行;
  • -D: 只打印重復(fù)行,并且把所有重復(fù)行打印出來。

實(shí)例

  • 對/etc/passwd中以:,對最后一列求出現(xiàn)的次數(shù)
[root@master ~]# awk -F":" '{print $NF}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
[root@master ~]# awk -F":" '{print $NF}' /etc/passwd |sort |uniq -c |sort -nr
     22 /sbin/nologin
      1 /sbin/shutdown
      1 /sbin/halt
      1 /bin/sync
      1 /bin/nologin
      1 /bin/bash

先利用awk打印出最后一列內(nèi)容,之后利用sort 來進(jìn)行排序,將相同的字符規(guī)在一起輸出,最后對相同的行進(jìn)行去重,得出每種不同類型shell出現(xiàn)的次數(shù),最后對數(shù)學(xué)從大到小排序。

3. find

簡介:顧名思義,就是用來在系統(tǒng)中查找文件的工具,可以指定一個(gè)基礎(chǔ)起始目錄,根據(jù)不同的選項(xiàng)查找不同的文件。

語法find path -option [ -print ] [ -exec -ok command ] {} \;

原理:find 根據(jù)option在指定的系統(tǒng)路徑中查找文件,如果查找到與對應(yīng)的exec命令,則執(zhí)行對應(yīng)的command。

  • print: find 命令將匹配的文件輸出到標(biāo)準(zhǔn)輸出;
  • exec: find 命令對匹配的文件執(zhí)行該參數(shù)所給出的 shell 命令。相應(yīng)命令的形式為 ‘command’ {} ;,注意 {} 和 \;之間的空格;
  • ok: 和 - exec 的作用相同,只不過以一種更為安全的模式來執(zhí)行該參數(shù)所給出的 shell 命令,在執(zhí)行每一個(gè)命令之前,都會(huì)給出提示,讓用戶來確定是否執(zhí)行;

選項(xiàng)說明

- -name   filename               #查找名為 filename 的文件
- -perm                          #按執(zhí)行權(quán)限來查找
- -user    username              #按文件屬主來查找
- -group groupname          	 #按組來查找
- -mtime   -n +n                 #按文件更改時(shí)間來查找文件,-n 指 n 天以內(nèi),+n 指 n 天以前
- -atime    -n +n                #按文件訪問時(shí)間來查 GIN: 0px">
- -ctime    -n +n                #按文件創(chuàng)建時(shí)間來查找文件,-n 指 n 天以內(nèi),+n 指 n 天以前
- -type    b/d/c/p/l/f           #查是塊設(shè)備、目錄、字符設(shè)備、管道、符號鏈接、普通文件
- -size      n [c]               #查長度為 n 塊 [或 n 字節(jié)] 的文件
- -depth                         #使查找在進(jìn)入子目錄前先行查找完本目錄
- -prune                        #通常和 -path 一起使用,用于將特定目錄排除在搜索條件之外。過濾條件寫在其他條件前面。

在此我們對命令支持的選項(xiàng)全部展開詳解,根據(jù)日常經(jīng)驗(yàn)結(jié)合實(shí)際案例列舉最常用的選項(xiàng)進(jìn)行說明:

實(shí)例:

  • 在當(dāng)前目錄尋找文件名稱以.txt結(jié)尾的文件并打印出來
[root@master ~]# find   ~   -name   "*.txt"   -print 
/root/kubesphere-all-advanced-2.0.2/scripts/os/requirements.txt
/root/kubesphere-all-advanced-2.0.2/kubesphere/roles/storages/NFS-Server/files/nfs-server-provisioner/templates/NOTES.txt
/root/kubesphere-all-advanced-2.0.2/kubesphere/roles/ks-devops/jenkins/files/jenkins/jenkins-update-center/templates/NOTES.txt
/root/kubesphere-all-advanced-2.0.2/kubesphere/roles/ks-devops/harbor/files/harbor/harbor/templates/NOTES.txt
/root/kubesphere-all-advanced-2.0.2/kubesphere/roles/metrics-server/files/metrics-server/templates/NOTES.txt
/root/kubesphere-all-advanced-2.0.2/kubesphere/roles/openpitrix/files/openpitrix/kubernetes/password.txt
  • 查找 /usr/bin 目錄下大于 10M 的文件
[root@master ~]# find /usr/bin -size +10000k -exec ls -ld {} \; 
-rwxr-xr-x. 1 root root 13606800 Jul 10  2018 /usr/bin/ceph-dencoder
-rwxr-xr-x. 1 root root 15863688 Jul 10  2018 /usr/bin/ceph-objectstore-tool
-rwxr-xr-x. 1 root root 15589080 Jul 10  2018 /usr/bin/ceph-osd
-rwxr-xr-x. 1 root root 33073928 Feb 10  2019 /usr/bin/docker
-rwxr-xr-x. 1 root root 38088856 Feb 10  2019 /usr/bin/docker-containerd
-rwxr-xr-x. 1 root root 68608416 Feb 10  2019 /usr/bin/dockerd
-rwxr-xr-x. 1 root root 20895160 Feb 10  2019 /usr/bin/docker-containerd-ctr
-rwxr-xr-x. 1 root root 10785264 Jul 10  2018 /usr/bin/ceph-mon
  • 查找當(dāng)前目錄下權(quán)限為 777 的文件
[root@master ~]# find . -perm 777 -print   
./.helm/repository/cache/local-index.yaml
./kubesphere-all-v2.1.0/k8s/extra_playbooks/inventory
./kubesphere-all-v2.1.0/k8s/extra_playbooks/roles
./kubesphere-all-v2.1.0/k8s/contrib/terraform/openstack/hosts

4. date

在我們編寫 Shell 的時(shí)候經(jīng)常遇到需要記錄日志的情況,在記錄日志的時(shí)候需要打上時(shí)間戳,以便后期查看那個(gè)時(shí)間節(jié)點(diǎn)運(yùn)行執(zhí)行的操作,此時(shí)就需要用到 date 命令

簡介:date 可以用來顯示或設(shè)定系統(tǒng)的日期與時(shí)間。

選項(xiàng)

-d<字符串>:顯示字符串所指的日期與時(shí)間。字符串前后必須加上雙引號; 
-s<字符串>:根據(jù)字符串來設(shè)置日期與時(shí)間。字符串前后必須加上雙引號; 
-u:顯示GMT; 

時(shí)間格式:

%Y -- 年份
%m -- 月份
%d -- 當(dāng)月第幾天
%t -- Tab 跳格
%H -- 小時(shí),24 小時(shí)格式 (0~23)
%I -- 小時(shí),12 小時(shí)格式 (0~12)
%M -- 分鐘 (00~59)
%S -- 秒 (00~59)
%j -- 今年中的第幾天
%Z -- 以字符串形式輸出當(dāng)前時(shí)區(qū)
%z -- 以數(shù)字形式輸出當(dāng)前時(shí)區(qū)
%F --  文件時(shí)間格式 same as % Y-% m-% d
%T -- 24 小時(shí)制時(shí)間表示 (hh:mm:ss)
  • 實(shí)例

計(jì)算一個(gè)命令執(zhí)行所需要的耗時(shí)

#!/bin/bash 
start=$(date +%s) 
echo "$(date +%F" "%T) 開始執(zhí)行命令"
sleep 5
echo "$(date +%F" "%T) 執(zhí)行命令完成"
end=$(date +%s) 
difference=$(( end - start )) 
echo "執(zhí)行命令總耗時(shí):$difference seconds."

[root@master ~]# bash time.sh 
2020-04-19 10:19:58 開始執(zhí)行命令
2020-04-19 10:20:03 執(zhí)行命令完成
執(zhí)行命令總耗時(shí):5 seconds.

5. xargs

簡介:xargs 全稱是 transform arguments,意為轉(zhuǎn)換參數(shù),它將標(biāo)準(zhǔn)輸入轉(zhuǎn)換為命令行參數(shù)。因?yàn)?linux 命令行中經(jīng)常要使用到管道符連接不同的命令,但是有些命令不支持標(biāo)準(zhǔn)輸入,此時(shí)就需要使用 xargs 將標(biāo)準(zhǔn)輸入轉(zhuǎn)換為參數(shù),

語法stdin_input | xargs [option] cmd

原理:xargs 一般是通過管道符接受標(biāo)準(zhǔn)輸入并將其轉(zhuǎn)換為命令行參數(shù)傳遞給 cmd。

實(shí)例

  • 將標(biāo)準(zhǔn)輸入轉(zhuǎn)換成命令行參數(shù)
[root@master ~]# seq 1 6
1
2
3
4
5
6
[root@master ~]# seq 1 6 |xargs -n 2
1 2
3 4
5 6
  • 刪除日志文件
ls *.log |xargs rm -r	f {} 
  • 查找 /home/data 下權(quán)限為 644 的文件修改權(quán)限為 600
find /home/data -perm 644 | xargs chmod 600 
  • 查找 jpg 文件并打包
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz

6. 實(shí)例

6.1 需求

我們經(jīng)常在 Linux 系統(tǒng)操作操作文件,俗話說常在河邊走,哪有不濕鞋,一不小心刪除重要文件是非常危險(xiǎn)的。我們可以利用 Shell 腳本來制作一個(gè)類似于 Windows 下的回收站,配合定時(shí)任務(wù),定期清理這個(gè)回收站中的內(nèi)容,從而達(dá)到緩沖及規(guī)避危險(xiǎn)操作。

6.2 思路

  • 通過 alias rm 來將刪除的文件,移動(dòng)文件到一個(gè)回收站目錄;
  • 定期的在系統(tǒng)磁盤允許可控的使用率情況下,對回收站目錄下的文件進(jìn)行刪除。

6.3 實(shí)現(xiàn)

#!/bin/bash
# function:自定義rm命令,每天晚上定時(shí)清理

# 指定變量
CMD_SCRIPTS=$HOME/.rm_scripts.sh
TRASH_DIR=$HOME/.TRASH_DIR
CRON_FILE=/var/spool/cron/root
BASHRC=$HOME/.bashrc

[ ! -d ${TRASH_DIR} ] && mkdir -p ${TRASH_DIR}
cat > $CMD_SCRIPTS <<EOF
PARA_CNT=\$#
TRASH_DIR=$TRASH_DIR

for i in \$*; do
     DATE=\$(date +%F%T)
     fileName=\$(basename \$i)
     mv \$i \$TRASH_DIR/\$fileName.\$DATE
done
EOF

sed -i "s@$(grep 'alias rm=' $BASHRC)@alias rm='bash ${CMD_SCRIPTS}'@g" $BASHRC
source $HOME/.bashrc

# 制作定時(shí)清理任務(wù)
echo "0 0 * * * rm -rf $TRASH_DIR/*" >> $CRON_FILE
echo "刪除目錄:$TRASH_DIR"
echo "刪除腳本:$CMD_SCRIPTS"
echo "請執(zhí)行:source $BASHRC 來加載文件或退出當(dāng)前shell重新登錄"

對防治誤刪除腳本進(jìn)行系統(tǒng)測試。

[root@10-234-1-235 ~]# bash custom_rm.sh 
刪除目錄:/root/.TRASH_DIR
刪除腳本:/root/.rm_scripts.sh
請執(zhí)行:source /root/.bashrc 來加載文件或退出當(dāng)前shell重新登錄
[root@10-234-1-235 ~]# rm testdir/
[root@10-234-1-235 ~]# rm wget-log 
[root@10-234-1-235 ~]# ls -la .TRASH_DIR/
total 16
drwxr-xr-x.  3 root root 4096 Apr 18 20:11 .
dr-xr-x---. 13 root root 4096 Apr 18 20:11 ..
drwxr-xr-x.  2 root root 4096 Apr 18 20:10 testdir.2020-04-1820:11:37
-rw-r--r--.  1 root root    0 Jan  9 21:59 wget-log.2020-04-1820:11:40

# 查看定時(shí)任務(wù)
[root@10-234-1-235 ~]# crontab -l
0 0 * * * rm -rf /root/.TRASH_DIR/*

7. 小結(jié)

Shell 編程就是利用工具加數(shù)據(jù)結(jié)構(gòu)流程控制實(shí)現(xiàn)一組操作,所以掌握更多常用的工具或命令非常利于我們編寫 Shell 腳本,平時(shí)可以多嘗試?yán)酶鞣N命令或工具,并在 Shell 中熟練運(yùn)用它們,勤練并反思總結(jié),歸納整理,日積月累就會(huì)形成自己強(qiáng)大的工具庫。