內置命令(13)

命令(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中執行lsls結束後不返回原來的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 "任何信息" " 任何信息"
相關文章
相關標籤/搜索