命令(20個)node
echo,printf,rpm,yum,watch,alias,unalias,clear,history,eject,time,nc,xargs,exec,export,unset,type,bc,tee,read
python
13.1.xargs
mysql
功能:從標準輸入來執行命令linux
經常使用選項:sql
-a file 從指定文件讀取數據做爲標準輸入docker
-0 處理包含空格的文件名,print0shell
-d delimiter 分隔符,默認是空格分隔顯示數據庫
-i 標準輸入的結果以{}代替vim
-I 標準輸入的結果以指定的名字代替centos
-t 顯示執行命令
-p 交互式提示是否執行命令
-n 最大命令行參數
--show-limits 查看系統命令行長度限制
示例:
上面find的例子已經不少了
介紹兩個經常使用的:
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost scripts]# cat number.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[root@localhost scripts]# cat number.txt |xargs -n1 #列變行,-n1就是最大1列打印
1
2
3
4
5
6
7
8
[root@localhost scripts]# cat number.txt |xargs -n2 #這裏就是最大兩列打印
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
[root@localhost scripts]# cat number.txt |xargs -n3 #3列顯示
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20</span>
13.2.exec
exec命令 |
做用 |
exec ls |
在shell中執行ls,ls結束後不返回原來的shell中了 |
exec <file |
將file中的內容做爲exec的標準輸入 |
exec >file |
將file中的內容做爲標準寫出 |
exec 3<file |
將file讀入到fd3中 |
sort <&3 |
fd3中讀入的內容被分類 |
exec 4>file |
將寫入fd4中的內容寫入file中 |
ls >&4 |
Ls將不會有顯示,直接寫入fd4中了,即上面的file中 |
exec 5<&4 |
建立fd4的拷貝fd5 |
exec 3<&- |
關閉fd3 |
exec 執行程序
雖然exec和source都是在父進程中直接執行,但exec這個與source有很大的區別,source是執行shell腳本,並且執行後會返回之前的shell。而exec的執行不會返回之前的shell了,而是直接把之前登錄shell做爲一個程序看待,在其上經行復制。
舉例說明:
root@localhost:~/test#exec ls
exp1 exp5 linux-2.6.27.54 ngis_post.sh test xen-3.0.1-install
<logout>
[root@localhost ~]# exec >text
[root@localhost ~]# ls
[root@localhost ~]# pwd
[root@localhost ~]# echo "hello"
[root@localhost ~]# exec >/dev/tty
[root@localhost ~]# cat text
anaconda-ks.cfg
install.log
install.log.syslog
test
text
/root
hello
exec >text 是將當前shell的標準輸出都打開到text文件中
root@localhost:~/test#cat test
ls
Pwd
root@localhost:~/test#bash
root@localhost:~/test#exec <test
root@localhost:~/test#ls
exp1 exp5 linux-2.6.27.54 ngis_post.sh test text xen-3.0.1-install
root@localhost:~/test#pwd
/root/test
root@localhost:~/test#
root@localhost:~/test#exit #自動執行
exec的重定向
先上咱們進如/dev/fd/目錄下看一下:
[root@localhost ~]# cd /dev/fd
[root@localhost fd]# ls
0 1 2 255
在shell腳本中使用exec命令,根據操做的對象不一樣會有不一樣的行爲
默認會有這四個項:
0是標準輸入,默認是鍵盤。
1是標準輸出,默認是屏幕/dev/tty
2是標準錯誤,默認也是屏幕
其餘 3-9 都是空白描述符
當咱們執行exec 3>test時:
[root@localhost fd]# exec 3>/root/test
[root@localhost fd]# ls
0 1 2 255 3
多了個3,也就是又增長了一個設備,這裏也能夠體會下linux設備即文件的理念。這時候fd3就至關於一個管道了,重定向到fd3中的文件會被寫在test中。關閉這個重定向能夠用exec 3>&-。
[root@localhost fd]# who >&3
[root@localhost fd]# ls >&3
[root@localhost fd]# exec 3>&-
[root@localhost fd]# cat /root/test
root tty1 2017-06-04 10:28
root pts/0 2017-06-04 21:42 (192.168.6.8)
root pts/1 2017-06-04 21:51 (192.168.6.8)
root pts/2 2017-08-30 23:37 (192.168.6.8)
root pts/3 2017-08-30 23:55 (192.168.6.8)
0
1
2
255
3
應用舉例:
[root@localhost scripts]# cat ex.sh
#!/bin/bash
exec 3</root/test
while read -u 3 pkg;do
echo "$pkg"
done
[root@localhost scripts]# sh ex.sh
root tty1 2017-06-04 10:28
root pts/0 2017-06-04 21:42 (192.168.6.8)
root pts/1 2017-06-04 21:51 (192.168.6.8)
root pts/2 2017-08-30 23:37 (192.168.6.8)
root pts/3 2017-08-30 23:55 (192.168.6.8)
0
1
2
255
3
exec 3>&1 4>&2 1>> zhis_bash.log 2>&1
其含義是 複製標準輸出到3 錯誤輸出到 4 把 3 4 保存在zhis_bash.log 這個文件中等同於 再寫一個shell 相似
[sql] view plain copy
cat another shell
./zhis_bash.sh >>zhis_bash.log 2>&1
若是exec 跟的是其餘命令,則其餘命令結束後,本shell也隨之中止
[root@localhost ~]# cat test_exec.sh
#!/bin/bash
echo "hello mysql"
exec echo " hello oracle"
echo "hello db2"
運行一下
[root@localhost ~]# ./test_exec.sh
hello mysql
hello oracle
能夠看到隨着 echo " hello oracle" 這條指令運行完本 整個腳本執行完畢。
後面的 echo " hello db2" 沒有執行
13.3.echo
功能:打印一行
語法:
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION
經常使用選項:
-n:不輸出換行符
-e:解釋轉義字符
-E:不解釋
示例:
[root@localhost ~]# echo -e '1\n2\n3' #加了-e,就把\n定義爲換行字符,這樣纔會換行打印
1
2
3
[root@localhost ~]# echo '1\n2\n3' #不加就只是做爲字符輸出了
1\n2\n3
[root@localhost ~]# echo -e '1\t2\t3' #解釋製表符
1 2 3
[root@localhost ~]# echo '1\t2\t3'
1\t2\t3
[root@localhost ~]# echo hello,world > 1 #echo的重定向功能
[root@localhost ~]# cat 1
hello,world
[root@localhost ~]# echo welcome to linux world >> 1 #echo的追加功能
[root@localhost ~]# cat 1
hello,world
welcome to linux world
13.4.printf
功能:格式化打印數據,默認打印字符串不換行
語法:printf FORMAT [ARGUMENT]...
printf OPTION
經常使用選項:
format:
%.ns 輸出字符串,n是輸出幾個字符
%ni 輸出整數,n是輸出幾個數字
%m.nf 輸出浮點數,m是輸出的整數位數,n是輸出的小數位數
%x 不帶正負號的十六進制值,使用a至f表示10至15
%X 不帶正負號的十六進制,使用A至F表示10至15
%% 輸出單個%
%d 有符號32位整數
%lld 有符號64位整數
%llx 有符號64位16進制整數
%u 無符號32位整數
經常使用空白符:
\n:換行
\r:回車
\t:水平製表符
對齊方式:
%-5s 對參數每一個字段左對齊,寬度爲5
%-4.2f 左對齊,寬度爲4,保留兩位小數
不加橫線"-"表示右對齊。
示例:
#打印一個字符:
[root@localhost test]# printf "%.1s" 123
#打印三個字符:
1[root@localhost test]# printf "%.3s" 123
#不保留小數,前面什麼都不加
123[root@localhost test]# printf "%.f" 1.314529
#保留兩位
1[root@localhost test]# printf "%.2f" 1.314529
#換行打印,看到前面的爲啥沒有結果,由於都跑到第二行開頭來了
1.31[root@localhost test]# printf "%.2f\n" 1.314529
1.31
#格式化打印:
[root@localhost test]# printf "user: %s\tpassword: %d\n" root 123
user: root password: 123
#左對齊寬度5
[root@localhost test]# printf "%-5s %-5s %-5s\n" 1 2 3
1 2 3
#右對齊寬度5
[root@localhost test]# printf "%5s %5s %5s\n" 1 2 3
1 2 3
#每行右對齊
[root@localhost test]# printf "%5s\n" 1 2 3
1
2
3
#每行左對齊
[root@localhost test]# printf "%-5s\n" 1 2 3
1
2
3
13.5.rpm
功能:rpm軟件包管理器
經常使用選項:
-ivh 安裝軟件包
-Uvh 升級軟件包,若是原來軟件包不存在則安裝
-Fvh 升級軟件包,若是原來的軟件包不存在則中止升級
-e 卸載軟件包
--nodeps 忽略依賴關係
注意:
安裝時,儘可能不要忽略依賴關係;卸載時能夠忽略依賴關係
-f 強制安裝
-q 查看軟件包是否安裝上
-qa 查看全部的安裝的rpm包
-qa |grep xxx
-ql 查看軟件所帶來的軟件列表
-qc 查看軟件所帶來的配置文件
-qd 查看軟件所帶來的幫助文檔
-qf filename 查看文件來自於哪一個軟件包
rpm --import PUBKEY .. 導入軟件包的數字簽名認證
--test 測試
--initdb 初始化rpm數據庫
--rebuilddb 重建rpm數據庫 在rpm和yum無響應的狀況使用 先 rm -f /var/lib/rpm/__db.00* 在重建
示例:
1)rpm包管理:
# rpm -ivh zsh-4.3.10-5.el6.x86_64.rpm
warning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
--這是成功安裝
# rpm -ivh zsh-4.3.10-5.el6.x86_64.rpm
warning: zsh-4.3.10-5.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing... ########################################### [100%]
package zsh-4.3.10-5.el6.x86_64 is already installed
--這是已經安裝過了
關於上面的警告信息,其實就是在說操做系統沒有這個軟件包相關的簽名信息;你用rpm命令來安裝,有沒有此警告無所謂。但若是你用yum來安裝,yum裏一個參數爲gpgcheck=0的話,則表示沒簽名沒問題,gpgcheck=1的話,則沒簽名就安裝不了。
解決這問題:
# rpm --import RPM-GPG-KEY-redhat-release
2)依賴性的問題:
# rpm -ivh mysql-5.1.61-4.el6.x86_64.rpm
error: Failed dependencies:
libmysqlclient.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64
libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64
libmysqlclient_r.so.16()(64bit) is needed by mysql-5.1.61-4.el6.x86_64
libmysqlclient_r.so.16(libmysqlclient_16)(64bit) is needed by mysql-5.1.61-4.el6.x86_64
mysql-libs = 5.1.61-4.el6 is needed by mysql-5.1.61-4.el6.x86_64
--這些依賴性怎麼解決,若是你安裝的是rhel的iso裏的包,那麼它的依賴包也必定在iso裏(若是你是安裝一個第三方的包,那麼依賴性就不能保證全在iso裏)
解決的過程很艱辛,具體查找的過程就不寫了,下面這是安裝順序,而且最後一句比較特殊,它是A依賴B,B又同時依賴A,要兩個一塊兒安裝的一個典型例子
# rpm -ivh mysql-libs-5.1.61-4.el6.x86_64.rpm
# rpm -ivh keyutils-libs-devel-1.4-4.el6.x86_64.rpm
# rpm -ivh libcom_err-devel-1.41.12-12.el6.x86_64.rpm
# rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm
# rpm -ivh libselinux-devel-2.0.94-5.3.el6.x86_64.rpm
# rpm -ivh krb5-devel-1.9-33.el6.x86_64.rpm
# rpm -ivh openssl-devel-1.0.0-20.el6_2.5.x86_64.rpm
# rpm -ivh mysql-devel-5.1.61-4.el6.x86_64.rpm mysql-5.1.61-4.el6.x86_64.rpm
3)衝突:
報錯裏有conflict關鍵字的時候,就是衝突了,解決方法:通常來講要先幹掉衝突的包,再安裝新包
可是也有特殊狀況,好比我已經安裝了A包,而後安裝B包時,報兩個包的其中一個文件衝突,怎麼解決?
方法一:把這個文件mv走,而後安裝
方法二: rpm -ivh --force xxxx.rpm 強制安裝,那麼這個衝突的文件會被覆蓋
方法三: rpm -ivh --nodocs xxxx.rpm 這個nodocs的參數表示不安裝它的文檔文件(若是你衝突的文件是一個文檔的話。若是不是文檔文件,則要用其它相關參數
rpm -ivh --nodeps 脫離依賴性 可是包不必定能用,由於你少了一些依賴包的功能
rpm -ivh --nomd5 不檢驗md5值
rpm -ivh --noscripts 不想啓用或者自動執行某些命令
rpm -ivh --replacefiles 某個文件已經安裝在系統上,或者衝突,能夠用此參數覆蓋 注意:此操做沒法復原
rpm -ivh --replacepkgs 從新安裝某個已經安裝過的包,好比說一個包你修改過,但不知道改在哪裏,能夠這樣從新安裝
rpm -ivh --force 至關是強制安裝,是--replacefiles和--replacepkgs
rpm -ivh --test 測試是否能安裝到此linux系統中
rpm -qa --查看你係統上已經安裝的rpm包(注意,只限於rpm包)
# rpm -qa |grep mysql
rpm -ql
# rpm -ql mysql-5.1.61-4.el6.x86_64 --查看一個軟件包都安裝了哪些文件,從這裏也能夠了解到linux安裝軟件是把文件按功能分散到各個目錄,後面的包名不用寫全
# rpm -qpl rpm -qpl mysql-5.1.61-4.el6.x86_64.rpm --若是你一個軟件包尚未安裝,但你要查看一下安裝會產生哪些文件分佈,能夠加個p參數,但後面的包名要寫全
rpm -qi mysql-5.1.61-4.el6.x86_64 --查看軟件包有關信息和說明
# rpm -qf `which mount` --查看一個文件屬於哪一個軟件包
util-linux-ng-2.17.2-12.7.el6.x86_64
# rpm -e mysql-5.1.61-4.el6.x86_64 --刪除一個rpm包的安裝,可是刪除也有依賴性.
13.6.yum
功能:rpm軟件包在線安裝工具
語法:
yum [options] [command] [package ...]
經常使用選項:
yum clean all 清空緩存
yum makecache 建立緩存
yum install xxx 安裝軟件
yum -y install xxx 取消交互
yum remove xxx 卸載軟件
yum update 更新本系統中已經安裝的全部軟件包(比倉庫裏版本低都更新)
yum update xxx 單獨更新某個軟件
yum list 列出倉庫裏全部的軟件包
yum list |grep xxx 過濾某個軟件包 @表明已經安裝,後面跟的是來自於-x哪一個倉庫
yum list installed 查看當前操做系統中已經安裝的全部軟件包
yum list installed|grep tigervnc
yum localinstll xxx.rpm 安裝本地的rpm包
yum search xxx 搜索相關包
repoquery -ql gstreamer # 不安裝軟件查看包含文件
對應組的用法:
yum grouplist 查看包組
yum groupinstall -y "包組名" 安裝一個包組
yum grouplist
yum groupinstall 組名
yum groupinstall "組名1 組名2"
yum groupremove 組名
示例:
本地yum源
步驟:
1)本地須要有一個鏡像文件
2)掛在鏡像文件到操做系統的掛在點,而且開機自動掛載
mkdir /yum 建立一個掛在點
# mount /mnt/hgfs/soft/rhel-server-6.5-x86_64-dvd.iso /yum -o loop 手動掛載
vim /etc/fstab 開機自動掛在
/mnt/hgfs/soft/rhel-server-6.5-x86_64-dvd.iso /yum iso9660 defaults,ro,loop 0 0
3)配置yum源
# vim /etc/yum.conf --主配置文件,但通常不用它
/etc/yum.repos.d/xxx.repo --這個目錄下只要以.repo結尾的文件就是子配置文件
# rm /etc/yum.repos.d/* -rf --默認有兩文件,沒用,刪掉
# vim /etc/yum.repos.d/localyum.repo --新建一個以repo結尾的文件就能夠
[server] --軟件倉庫名,自定義
name=server --標識名,自定義
baseurl=file:///yum/ --這一條最重要,它表示你的倉庫的地址。本地倉庫的寫法file:/// 要接三個/
enabled=1 --等於1表示打開倉庫,等於0表示不使用此倉庫
gpgcheck=0 --不驗證gpg簽名
上面這一段配置就包含了iso鏡像裏的大部分軟件,完整的配置以下:(這是redhat鏡像的詳細配置)
[server]
name=server
baseurl=file:///yum/
enabled=1
gpgcheck=0
[HighAvailability]
name=HighAvailability
baseurl=file:///yum/HighAvailability/
enabled=1
gpgcheck=0
[LoadBalancer]
name=LoadBalancer
baseurl=file:///yum/LoadBalancer/
enabled=1
gpgcheck=0
[ResilientStorage]
name=ResilientStorage
baseurl=file:///yum/ResilientStorage/
enabled=1
gpgcheck=0
[ScalableFileSystem]
name=server
baseurl=file:///yum/ScalableFileSystem
enabled=1
gpgcheck=0
補充:
yum使用epel源
# 包下載地址: http://download.fedoraproject.org/pub/epel # 選擇版本5\6\7
rpm -Uvh http://mirrors.hustunique.com/epel//6/x86_64/epel-release-6-8.noarch.rpm
# 自適配版本
yum install epel-release
自定義yum源
find /etc/yum.repos.d -name "*.repo" -exec mv {} {}.bak \;
vim /etc/yum.repos.d/yum.repo
[yum]
#http
baseurl=http://10.0.0.1/centos5.5
#掛載iso
#mount -o loop CentOS-5.8-x86_64-bin-DVD-1of2.iso /data/iso/
#本地
#baseurl=file:///data/iso/
enable=1
#導入key
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
編譯
源碼安裝
./configure --help # 查看全部編譯參數
./configure --prefix=/usr/local/ # 配置參數
make # 編譯
# make -j 8 # 多線程編譯,速度較快,但有些軟件不支持
make install # 安裝包
make clean # 清除編譯結果
perl程序編譯
perl Makefile.PL
make
make test
make install
python程序編譯
python file.py
源碼包編譯安裝
python setup.py build
python setup.py install
編譯c程序
gcc -g hello.c -o hello
13.7.watch
功能:檢測一個命令的運行結果
經常使用參數:
-n或--interval watch缺省每2秒運行一下程序,能夠用-n或-interval來指定間隔的時間。
-d或--differences 用-d或--differences 選項watch 會高亮顯示變化的區域。 而-d=cumulative選項會把變更過的地方(無論最近的那次有沒有變更)都高亮顯示出來。
-t 或-no-title 會關閉watch命令在頂部的時間間隔,命令,當前時間的輸出。
-h, --help 查看幫助文檔
示例:
每隔一秒高亮顯示網絡連接數的變化狀況
watch -n 1 -d netstat -ant
每隔一秒高亮顯示http連接數的變化狀況
watch -n 1 -d 'pstree|grep http'
實時查看模擬***客戶機創建起來的鏈接數
watch 'netstat -an | grep:21 | \ grep<模擬***客戶機的IP>| wc -l'
監測當前目錄中 scf' 的文件的變化
watch -d 'ls -l|grep scf'
10秒一次輸出系統的平均負載
watch -n 10 'cat /proc/loadavg'
13.8.alias
功能:定義別名
經常使用選項:
-p:打印現有的全部別名(惟一參數)
示例:
#alias kk=ls 只在當前終端生效
#unalias kk 取消別名
#vim /root/.bashrc 永久定義別名,局部配置文件(針對root)
#alias kk='ls -l'
#source ~/.bashrc 或者. ~/.bashrc 馬上立刻生效
#vim /etc/bashrc 讓全部的用戶都生效(全局)
13.9.unalias
功能:刪除別名
語法:unalias [-a][別名]
經常使用選項:
-a 刪除所有的別名
示例:
[root@localhost ~]# alias lx=ls
[root@localhost ~]# lx
[root@localhost ~]# alias lx #查看別名
alias lx='ls'
[root@localhost ~]# unalias lx #刪除別名
[root@localhost ~]# lx
-bash: lx: command not found
13.10.clear
功能:清屏
ctrl+L也有一樣效果
13.11.history
功能:打印或操做歷史命令列表
經常使用選項:
-c:清空命令歷史
-d n:刪除指定歷史命令,n表示命令行號
#:顯示最近的#條歷史命令
-a:追加本次會話新執行的歷史命令列表到歷史文件中
-n:讀取歷史命令文件中未讀過的行到歷史列表,這裏的歷史命令文件指的是存儲歷史命令的文件,歷史列表是執行history的列表
-r:讀取歷史文件中的命令到當前歷史列表,也就是history
-w:保存歷史列表到歷史命令文件中
history相關的環境變量:
HISTFILE 指定存放歷史文件位置,默認位置在~/.bash_profile,/etc/profile(針對全局 )
HISTFILESIZE 命令歷史文件記錄歷史的條數
HISTSIZE 命令歷史記錄的條數,默認爲1000
HISTTIMEFORMAT="%F %T" 顯示命令發生的時間
HISTIGNORE="str1:str2:..." 忽略string1,string2歷史
HISTCONTROL 包含一下4項,讓哪一項生效只須要讓其=下面一項便可
ignoredups: 忽略重複的命令;連續且相同方爲「重複」
ignorespace: 忽略全部以空白開頭的命令
ignoreboth:ignoredups,ignorespace
erasedups: 刪除重複命令
history經常使用的快捷鍵
從新調用前一個命令中最後一個參數:
!$
Esc, .(點擊Esc鍵後鬆開,而後點擊. 鍵)
!!:調用上一條命令
示例:
[root@localhost ~]# history |wc -l
1000
[root@localhost ~]# history -c #-c是清空歷史列表而非歷史文件中的命令
[root@localhost ~]# history |wc -l
1
[root@localhost ~]# history -r #-r加了歷史文件中的命令,又有1000條命令
[root@localhost ~]# history |wc -l
1000
[root@localhost ~]# history
.......................
2136 mv /home/yyl01/file{1..5} /home/yyl01/redhat/test/
2137 cd /home/yyl01/redhat/test/
2138 ls
2139 mv file{1..5} test1 test2 test3 test4 test5
2140 ls
2141 ls *|sed -i 's/file/test/g'
2142 ls *
2143 echo *
2144 echo * |sed -i 's/file/test/g'
2145 history |wc-l
2146 history |wc -l
2147 history
[root@localhost ~]# history -d 2139
[root@localhost ~]# history
.........
2137 cd /home/yyl01/redhat/test/
2138 ls
2139 ls
2140 ls *|sed -i 's/file/test/g'
2141 ls *
2142 echo *
2143 echo * |sed -i 's/file/test/g'
2144 history |wc-l
2145 history |wc -l
2146 history
2147 history -d 2139
2148 history
[root@localhost ~]# history -n 跟-r命令效果差很少,只是以未讀到歷史列表中的會讀到,而不是像-r全部
[root@localhost ~]# cat .bash_history |wc -l #說明只能存1000個命令
1000
[root@localhost ~]# history -w #-w存入也是覆蓋掉之前的,繼續是1000個命令
13.12.eject
功能:退出抽取式設備
若設備已掛入,則eject會先將該設備卸除再退出
經常使用參數:
[設備] 設備能夠是驅動程序名稱,也能夠是掛入點。
-a<開關>或--auto<開關> 控制設備的自動退出功能。
-c<光驅編號>或--changerslut<光驅編號> 選擇光驅櫃中的光驅。
-d或--default 顯示預設的設備,而不是實際執行動做。
-f或--floppy 退出抽取式磁盤。
-h或--help 顯示幫助。
-n或--noop 顯示指定的設備。
-q或--tape 退出磁帶。
-r或--cdrom 退出光盤。
-s或--scsi 以SCSI指令來退出設備。
-t或--trayclose 關閉光盤的托盤。
-v或--verbose 執行時,顯示詳細的說明。
示例:
# eject //不加參數默認彈出
# eject -r /dev/cdrom //指定設備
13.13.time
功能:統計給定命令所話費的總時間
示例:
[root@localhost ~]# time ls
.........
real 0m0.002s
user 0m0.001s
sys 0m0.001s
real指命令開始執行到結束的時間
user指進程花費在用戶模式中的CPU時間
sys指花費在內核模式中的CPU時間
使用-o選項將執行時間寫入到文件中
/usr/bin/time -o outfile.txt ls
使用-a選項追加信息
/usr/bin/time -a -o outfile.txt ls
使用-f選項格式化時間輸出
/usr/bin/time -f "time: %U" ls
13.14.nc
功能:是一個功能強大的網絡工具,全稱是netcat。查看TCP和UDP鏈接和偵聽
語法:nc [-hlnruz][-g<網關...>][-G<指向器數目>][-i<延遲秒數>][-o<輸出文件>][-p<通訊端口>][-s<來源位址>][-v...][-w<超時秒數>][主機名稱][通訊端口...]
經常使用選項:
-g <網關> 設置路由器躍程通訊網關
-G <指向器數目> 設置來源路由指向器,其數值爲4的倍數
-h 在線幫助
-i interval<延遲秒數> 指定間隔時間發送和接受行文本
-l 監聽模式,管控傳入的資料
-n 直接使用IP地址,而不經過域名服務器
-o <輸出文件> 指定文件名稱,把往來傳輸的數據以16進制文件保存
-p <通訊端口>指定本地源端口
-r 指定本地和遠程主機端口
-s <來源位址>指定本地源IP地址
-u 使用udp協議,默認是tcp
-v 執行過程輸出
-w <超時秒數> timeout 鏈接超時時間
-x proxy_address[:port] 請求鏈接主機使用代理地址和端口
-z 指定掃描監聽端口,不發送任何數據
示例:
安裝nc
[root@localhost log]# yum install -y nc
tcp端口掃描:
[root@localhost log]# nc -v -z -w2 127.0.0.1 1-100 #掃描本地tcp端口1-100
nc: connect to 127.0.0.1 port 1 (tcp) failed: Connection refused
......
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
[root@localhost log]# nc -z 127.0.0.1 1-65535 #掃描監聽的端口
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
Connection to 127.0.0.1 35186 port [tcp/*] succeeded!
簡單聊天工具:
[root@docker-node5 ~]# nc -l 1234 #在192.168.19.6上開啓1234端口做爲聊天端口
[root@localhost log]# nc 192.168.19.6 1234 #在192.168.19.20一樣開啓1234端口爲聊天端口
開始聊天:
[root@localhost log]# nc 192.168.19.6 1234
dff
[root@docker-node5 ~]# nc -l 1234 這邊的屏幕就會輸出剛纔的dff信息
dff
使用ctrl+C(或D)退出
拷貝文件:
[root@docker-node5 ~]# nc -l 1234 > test.txt
[root@localhost log]# nc 192.168.19.6 1234 < test.txt
13.15.export
功能:設置或顯示環境變量
經常使用參數:
f 表明[變量名稱]中爲函數名稱。
-n 刪除指定的變量。變量實際上並未刪除,只是不會輸出到後續指令的執行環境中。
-p 列出全部的shell賦予程序的環境變量。
示例:
[root@localhost ~]# export -p #列出當親啊的環境變量值
[root@localhost ~]# export MYENV 定義環境變量
[root@localhost ~]# export -p |grep MYENV 列出當前的環境變量
declare -x MYENV
[root@localhost ~]# export MYENV=7 #定義環境變量並賦值
[root@localhost ~]# export -p |grep MYENV
declare -x MYENV="7"
13.16.unset
功能:取消變量或函數
經常使用參數:
-f 僅刪除函數。
-v 僅刪除變量。
示例:
[root@localhost ~]# a=123
[root@localhost ~]# echo $a
123
[root@localhost ~]# unset a
[root@localhost ~]# echo $a
[root@localhost ~]#
13.17.type
功能:顯示指定命令的類型
命令類型有以下情形:
alias 別名
keyword 關鍵字,Shell保留字
function 函數,Shell函數
builtin 內建命令,Shell內建命令
file 文件,磁盤文件,外部命令
unfound 沒有找到
經常使用選項:
-a:顯示全部類型
-p:外部命令信息,至關於which
-f:shell函數信息
-t:指定類型信息
示例:
[root@localhost ~]# type echo echo is a shell builtin #內建命令
# type gtypist
gtypist is /usr/local/bin/gtypist #外部命令
[root@localhost ~]# type lsls is aliased to `ls --color=auto' 別名
[root@localhost ~]# type -a type #本身屬於內建命令
type is a shell builtin
[root@localhost ~]# type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
[root@localhost ~]# type -a time
time is a shell keyword
[root@localhost ~]# type -a which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'which is /usr/bin/which
13.18. tee
功能:從標準輸入讀取,寫到標準輸出和文件
語法:tee [OPTION]... [FILE]...
經常使用選項:
-a 追加到文件
示例:
[root@localhost ~]# echo 123 |tee -a 123
123
[root@localhost ~]# cat 123
123
說明:不過這樣不以爲這個命令增長工做量,輸入追加echo命令就能夠作到
13.19.read
功能:接收標準輸入,或其餘文件描述符的輸入
經常使用選項:
-d:輸入結束符,默認結束符是換行
-p:提示語句
-n:字符個數
-t:等待時間
-s:不回顯
-a:數組名
示例:
[root@localhost scripts]# cat read01.sh
#!/bin/bash
echo -n "enter your name:" #參數-n不換行,默認是換行的
read name read #讀入變量,後邊的echo才能引用變量
echo "hello $name"
執行結果:
[root@localhost scripts]# sh read01.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# sh read01.sh #沒有read的讀入,變量name不起做用,結果就是底下這樣
enter your name:hello
[root@localhost scripts]# cat read01.sh
#!/bin/bash
echo -n "enter your name:"
echo "hello $name"
-p參數使用
[root@localhost scripts]# sh read01.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# cat read01.sh
#!/bin/bash
read -p "enter your name:" name
echo "hello $name"
是否是比echo的效果好不少
-t參數使用
[root@localhost scripts]# sh read02.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# sh read02.sh 計時到時,會自動退出腳本
enter your name:sorry,timeout
[root@localhost scripts]# cat read02.sh
#!/bin/bash
if read -t 10 -p "enter your name:" name;then
echo "hello $name"
else
echo "sorry,timeout"
fi
-n參數使用
[root@localhost scripts]# sh read03.sh
enter your name:yyl
hello yyl
[root@localhost scripts]# sh read03.sh
enter your name:dfd
Usage:YYL|yyl PXT|pxt
[root@localhost scripts]# sh read03.sh
enter your name:pxt
fine,pxt
[root@localhost scripts]# cat read03.sh
#!/bin/bash
read -n3 -p "enter your name:" name
case $name in
YYL|yyl)
echo -e "\nhello $name"
;;
PXT|pxt)
echo -e "\nfine,$name"
;;
*)
echo -e "\nUsage:YYL|yyl PXT|pxt"
;;
esac
說明:使用-n後,後接3,表示read接到3個字符就對出,只要有字符輸入,read就會接受輸入傳給變量,無需按回車
-s選項使用
[root@localhost scripts]# sh read01.sh
enter your name:hello yyl
[root@localhost scripts]# cat read01.sh
#!/bin/bash
read -s -p "enter your name:" name
echo "hello $name"
說明:-s會隱藏你輸入的信息,起到一個安全保護的做用
運用read讀取文件
[root@localhost scripts]# sh read04.sh
LINE 1:root:x:0:0:root:/root:/bin/bash
................................
LINE 22:yyl:x:500:500::/home/yyl:/bin/bash
print ok
[root@localhost scripts]# sh read05.sh
LINE :root:x:0:0:root:/root:/bin/bash
................................
LINE :yyl:x:500:500::/home/yyl:/bin/bash
print ok
[root@localhost scripts]# cat read04.sh read05.sh
#!/bin/bash
count=1 #加入count是爲了加入行號
cat /etc/passwd |while read line;do #把cat查看的文件做爲read的讀入,一行行讀取
echo "LINE $count:$line"
count=$[ $count + 1 ] #每循環count加1
done
echo "print ok"
#!/bin/bash #這個腳本沒有加入count,它也會一行行去讀取,只是少了行號
cat /etc/passwd |while read line;do
echo "LINE $count:$line"
done
echo "print ok"
13.20.linux的計算器(bc、expr、dc、echo、awk)
1)bc
功能:linux命令行計算器
示例:
2)expr
功能:計算器,表達式豐富
示例:
[root@localhost ~]# expr 6 + 3 (字符數字之間有空格)
9
[root@localhost ~]# expr 2 \* 3 (特殊字符要轉義)
6
[root@localhost ~]# expr 14 % 9 (取餘)
5
[root@localhost ~]# a=3
[root@localhost ~]# expr $a+5 (無空格)
3+5
[root@localhost ~]# expr $a + 5 (變量,有空格)
8
[root@localhost ~]# a=`expr 4 + 2`
[root@localhost ~]# echo $a
6
[root@localhost ~]# expr $a + 3
9
另外,expr對於字串的操做(計算)也是很方便的,如:
//字串長度
# expr length "yangzhigang.cublog.cn"
21
//從位置處抓取字串
# expr substr "yangzhigang.cublog.cn" 1 11
yangzhigang
//字串開始處
# expr index "yangzhigang.cublog.cn" cu
13
//判斷是不是整數
[root@localhost ~]# expr a + 3
expr: non-numeric argument
[root@localhost ~]# echo $? #判斷狀態
2
[root@localhost ~]# expr 3 + 3
6
[root@localhost ~]# echo $?
0
3)dc
功能:比bc更復雜的計算器
示例:
[root@localhost ~]# dc
3
2+
p
5
4*
p
20
quit
[root@localhost ~]# echo 3 2+ 4*p |dc
20
4)echo
功能:echo除了輸入輸出還能夠作簡單計算
[root@localhost ~]# echo $((3+5))
8
[root@localhost ~]# echo $(((3+5)*2))
16
變量計算
[root@localhost ~]# a=10
[root@localhost ~]# b=5
[root@localhost ~]# echo $(($a+$b))
15
[root@localhost ~]# echo $a+$b
10+5
[root@localhost ~]# echo $a+$b |bc
15
計算前天日期
[root@localhost ~]# echo `date +%Y%m%d`
20170913
[root@localhost ~]# echo `date +%Y%m%d`-2
20170913-2
[root@localhost ~]# echo `date +%Y%m%d`-2|bc
20170911
5)awk
[root@localhost ~]# awk 'BEGIN{a=3+2;print a}'
5
[root@localhost ~]# awk 'BEGIN{a=(3+2)*2;print a}'
10
練習
一、找出根目錄下的全部塊設備文件,而且將標準輸出及標準錯誤重定向到/tmp/find.test文件中
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost mnt]# find / -type b > /tmp/find.test 2>&1</span>
二、找出/root目錄下小於2M的文件並長列出,同時將其追加到/tmp/find.test文件中
1M:等於1M
+1M:大於1M
-1M:小於1M
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost mnt]# find /root/ -size -2M -exec ls -l {} \; >>/tmp/find.test </span>
三、在/home/test目錄中建立10個文件,而且修改file1~file5的時間爲系統時間的5天前,file6的時間爲5月28,file7的爲5月29,file8的爲5月30
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost home]# pwd
/home
[root@localhost home]# touch file{1..10}
[root@localhost home]# ls
file1 file2 file4 file6 file8 old01 old03 old05 old07 old09 yyl
file10 file3 file5 file7 file9 old02 old04 old06 old08 old10 yyl01
[root@localhost home]# touch -d $(date +%Y%m%d) --date="6 days ago" file{1..5}
[root@localhost home]# ll
total 48
-rw-r--r-- 1 root root 0 May 25 15:37 file1
-rw-r--r-- 1 root root 0 May 31 15:35 file10
-rw-r--r-- 1 root root 0 May 25 15:37 file2
-rw-r--r-- 1 root root 0 May 25 15:37 file3
-rw-r--r-- 1 root root 0 May 25 15:37 file4
-rw-r--r-- 1 root root 0 May 25 15:37 file5
-rw-r--r-- 1 root root 0 May 31 15:35 file6
-rw-r--r-- 1 root root 0 May 31 15:35 file7
-rw-r--r-- 1 root root 0 May 31 15:35 file8
-rw-r--r-- 1 root root 0 May 31 15:35 file9
[root@localhost home]# touch -d 20170528 file6
[root@localhost home]# touch -d 20170529 file7
[root@localhost home]# touch -d 20170530 file8
[root@localhost home]# ll
total 48
-rw-r--r-- 1 root root 0 May 25 15:37 file1
-rw-r--r-- 1 root root 0 May 31 15:35 file10
-rw-r--r-- 1 root root 0 May 25 15:37 file2
-rw-r--r-- 1 root root 0 May 25 15:37 file3
-rw-r--r-- 1 root root 0 May 25 15:37 file4
-rw-r--r-- 1 root root 0 May 25 15:37 file5
-rw-r--r-- 1 root root 0 May 28 00:00 file6
-rw-r--r-- 1 root root 0 May 29 00:00 file7
-rw-r--r-- 1 root root 0 May 30 00:00 file8
-rw-r--r-- 1 root root 0 May 31 15:35 file9</span>
要求:1)找出5天之前的文件並將其拷貝到/backup目錄
<span data-wiz-span="data-wiz-span" style="font-size: 1rem;">[root@localhost home]# find ./ -mtime +5 -ok cp {} /backup/ \;</span>
2)找出5天之內的文件並將其拷貝到192.168.5.1上的/home/test目錄裏,而且重命名成本身的名字。redhat用戶密碼爲123
<span data-wiz-span="data-wiz-span" style="font-size: 1.167rem;">[root@localhost home]# find /home/redhat -mtime -5 -exec scp {} redhat@192.168.5.1:/home/test/zhangsan \;</span>
4.將/etc/passwd文件拷貝到/tmp目錄下面。在/tmp/passwd文件的第15行下添加「hello yyl」,並複製其下5行,粘貼在文件的最下面,保存。而後全文搜索將「/bin/bash」替換成yyl,並保存後面20行到 /tmp/passwd.bak文件中,退出編輯。
解答:
cp /etc/passwd /tmp
:15 按o到下行添加「hello yyl」
按esc光標移動下行
5yy shift+g end p
:%s/\/bin\/bash/yyl/g
:set nu
:11,30w /tpm/passwd.bak
5.找出/etc/下面的全部目錄並將其重定向到/tmp/etcdir文件裏
方法一:
[root@localhost tmp]# ll /etc/ >> /tmp/123
[root@localhost tmp]# cat /tmp/123 |grep ^d >> /tmp/etcdir
方法二:
root@localhost tmp]# ll /etc/ |grep ^d >> /tmp/etcdir
方法三:ls
#!/bin/bash
ls -l /etc/* | grep "^d" >> /tmp/ccc.txt
if [ $? -eq 0 ];then
echo "file is create successed"
else
echo "file is create failed"
fi
方法四:(用while+read循環)
[root@localhost scripts]# cat Dir.sh
#!/bin/bash
ls -l /etc/|grep ^d |while read line;do
echo $line >>/tmp/etcdir
done
cat /tmp/etcdir |wc -l
6.在/tmp/etcdir文件中追加「好好學習,每天向上」,而後把/etc/passwd文件的內容添加到/tmp/etcdir文件裏,並重命名爲newetcdir
[root@localhost scripts]# echo "好好學習,每天向上" >> /tmp/etcdir
[root@localhost scripts]# cat /etc/passwd >> /tmp/etcdir
[root@localhost scripts]#mv /tmp/etcdir /tmp/newetcdir
另一種方法:
[root@localhost scripts]# rename "etcdir" "newetcdir" /tmp/etcdir
7.小實驗
一個終端 tail -f /var/log/messages
另外一個終端logger -t "任何信息" " 任何信息" (logger命令後邊說)
再觀察第一個終端的變化
[root@localhost ~]# tail -f /var/log/messages
May 26 11:11:24 localhost 任何信息: 任何信息
May 26 11:11:35 localhost 任何信息: 任何信息
[root@localhost ~]# logger -t "任何信息" " 任何信息"