1. 程式人生 > >Linux中bash

Linux中bash

1 檢視可以使用的shell

cat /etc/shells

系統預設使用的是bash,有幾個好處:
1. 命令記憶功能(history)
2. 自動補全
3. 別名設定:alias
4. 萬用字元

2 檢視命令是內建還是外部

type 命令名稱(eg.ls

3 shell變數

3.1 變數的顯示:

echo $name

3.2 變數的設定

例如設定變數myname的值為jack:

myname=jack

3.3 變數取消

unset myname

案例:對經常要使用的長目錄名稱設定成變數,可以方便操作。例如

[root@h2
~]# work=/root/emotion/springboot-beatlsql/target [root@h2 ~]# cd $work

3.4 環境變數

可以使用envexport檢視環境變數,可以使用set檢視所有變數(包括自定義變數)。
注意:
- $本身也是變數,代表的是目前Shell的執行緒代號,即PID。
- ?也是特殊的變數,它是上一個執行的命令所傳回的值。

3.5 自定義變數轉環境變數

可以使用export
案例:子程序只能使用父程序的環境變數,如果要使用父程序的自定義變數,在父程序中要將自定義的變數轉成環境變數。

[root@h2 target]# work=/root/emotion/springboot-beatlsql/target
[root@h2 target]# echo $work #父程序 /root/emotion/springboot-beatlsql/target [root@h2 target]# bash #進入子程序 [root@h2 target]# echo $work #沒有顯示,因為子程序不能獲取父程序自定義的變數 [root@h2 target]# exit #退出子程序 exit [root@h2 target]# export work #將父程序的work變數轉成環境變數 [root@h2 target]# bash #進入子程序 [root@h2 target]# echo $work #子程序能獲取環境變數
/root/emotion/springboot-beatlsql/target

3.6 變數從鍵盤讀取

  1. read:讀取來自鍵盤的變數,語法:
read [-pt] 變數名   
-p:接提示符    
-t: 等待秒數(必須在等待秒數內輸入,不會一直等待使用者)

例如:

[root@h2 target]# read -p 請輸入您的名字:  yn
請輸入您的名字:mike
[root@h2 target]# echo $yn
mike
  1. declare/typeset:宣告變數型別,語法:
declare [-aixr] 變數名
-a:將變數定義為陣列
-i:將變數定義為整型數字
-x:用法跟export一樣,將變數帶出為環境變數
-r:將變數設定為只讀型別,該變數不可以修改內容,也不可以重設

例如:

[root@h2 ~]# declare sum=10+2+3 #預設變數的型別為字串
[root@h2 ~]# echo $sum
10+2+3
[root@h2 ~]# declare -i sum=10+2+3 #宣告sum為整型數字
[root@h2 ~]# echo $sum
15
  1. array變數型別,語法:

var[idex]=內容

例如:

[root@h2 ~]# var[1]=aa
[root@h2 ~]# var[2]=bb
[root@h2 ~]# var[3]=cc
[root@h2 ~]# echo ${var[1]},${var[2]},${var[3]}
aa,bb,cc

3.7 限制使用者資源:ulimit

ulimit [-SHacdfltu] [配額]
-a:後面不接任何引數,可以列出所有的限制額度
-f:此shell可以建立的最大檔案的容量

3.7 變數內容的刪除、替代和替換

1.從前向後刪除,用#,刪除的內容介於/到:之間(任意匹配字元都可以)

[[email protected] ~]# path=$PATH
[[email protected] ~]# echo $path
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
[[email protected] ~]# echo ${path#/*hbase/bin:} #刪除開始到"hbase/bin:"的內容
/root/apps/apache-maven-3.5.2/bin:/root/bin

注意:
- #代表符合替換文字的最短的那一個
- ##代表符合替換文字的最長的那一個

[root@h2 ~]# echo ${path#/*:}  #1
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
[root@h2 ~]# echo ${path##/*:} #2
/root/bin
[root@h2 ~]#

其中,1處的結果其實就是:
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin
2處的結果其實就是:
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

2.從後向前刪除,用%,

[[email protected] ~]# echo ${path%/apache-maven*bin}
/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps

3.替換:”/舊字串/新字串”或”//舊字串/新字串”
例如:將第一個usr替換成USR

[[email protected] ~]# echo ${path/usr/USR}
/USR/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/usr/lib/jvm/jdk1.8.0_151/jre/bin:/usr/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

將所有usr替換成USR

[[email protected] ~]# echo ${path//usr/USR}
/USR/local/tomcat/bin:/USR/local/sbin:/USR/local/bin:/sbin:/bin:/USR/sbin:/USR/bin:/USR/lib/jvm/jdk1.8.0_151/bin:/USR/lib/jvm/jdk1.8.0_151/jre/bin:/USR/lib/jvm/jdk1.8.0_151/bin:/home/hadoop/apps/hadoop-2.6.4/bin:/home/hadoop/apps/hadoop-2.6.4/sbin:/home/hadoop/apps/hive/bin:/home/hadoop/apps/hbase/bin:/root/apps/apache-maven-3.5.2/bin:/root/bin

4 命令別名與歷史命令

4.1 命令別名設定:alias,unalias

  1. 檢視目前有哪些命令別名:
[[email protected] ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

2.設定命令別名,格式:

alias 別名=命令

例如,

[root@h2 ~]# alias get='ps -ef | grep spring'
[root@h2 ~]# get
root     20504     1  0 Nov22 ?        00:01:22 java -jar springboot-beatlsql-0.0.1-SNAPSHOT.jar
root     31719 31660  0 18:56 pts/1    00:00:00 grep spring
[root@h2 ~]# alias
alias cp='cp -i'
alias get='ps -ef | grep spring'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

3.取消命令別名,格式:

unalias 命令別名

例如,取消get命令別名

[root@h2 ~]# unalias get
[root@h2 ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@h2 ~]# 

4.2 歷史命令:history

1.儲存位置:~/.bash_history。
2.可以通過echo $HISTSIZE檢視紀錄的總條數,預設1000(在/etc/profile裡面配置的)。
假設\~/.bash_history已結紀錄了0-1000條資料,登入主機後,執行了100條資料,那麼,系統會將101~1100這1000條紀錄新到\~/.bash_history中。所以,\~/.bash_history永遠只會儲存最近的1000條紀錄資料。
3.格式:

history [n]
history [-c]
history [-raw] histfiles
n:數字,列出最近的n條命令列
-c:將目前shell中的所有history內容全部清除
-r:將histfiles的內容儲存到當前shell的history中
-a:將目前新增的history命令新增入histfiles中,若沒有加histfiles,則預設寫入~/.bash_history
-w:將目前的hostory記憶內容寫入histfiles中

4.執行history中的命令:

!命令編號 #執行history中第幾條命令編號的意思
!字串 #由最近的命令向前搜尋hostory中以該字串開頭的命令,並執行

例如

[[email protected] ~]# history
 省略...
  981  netstat -anp|grep :80
  982  cd ..
  983  pa -ef |grep spring
  984  ps -ef |grep spring
  985  kill -9 17089
  986  cd ..
[[email protected] ~]# !981
netstat -anp|grep :80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      20504/java          
省略...
[[email protected] ~]# !ps
ps -ef|grep spring
root     20504     1  0 Nov22 ?        00:01:23 java -jar springboot-beatlsql-0.0.1-SNAPSHOT.jar
root     31945 31660  0 19:25 pts/1    00:00:00 grep spring

5 Bash Shell的操作環境

5.1 bash登入與歡迎資訊:/etc/issue,/etc/motd

1.非遠端登入的介面資訊在:/etc/issue
遠端登入的介面資訊在:/etc/issue.net
2.若想讓所有使用者登入後取得一些資訊,可以在/etc/motd裡新增這些資訊。
例如,新增資訊後登入:

Welcome to aliyun Elastic Compute Service!

本機將在晚間0:00到6:00進行系統維護,請不要在此期間登入,謝謝
[[email protected] ~]#

5.2 bash的環境配置檔案

  1. login shell:需要賬號密碼登入,
    non-login shell:例如命令登入後再以圖形介面啟動時。
  2. bash的在login shell情況下,
    (1)讀取的整體環境配置檔案是/etc/profile,但是/etc/profile還會呼叫其他的配置檔案。
    (2)\~/.bash_profile或\~/.bash_login或~/.profile屬於個人設定。其實bash的login shell設定只會讀取上面三個檔案的其中一個,而讀取的順序則是上面的順序。
    本主機有\~/.bash_profile檔案,它會呼叫~/.bashrc的內容。
[[email protected] ~]# cat .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
  1. bash的在non-login shell情況下,
    只會讀取~/.bashrc的內容而已。Centos 5.x還會主動呼叫/etc/bashrc檔案內容。
  2. source:讀入環境配置檔案的命令。

5.3 終端機的環境設定:stty,set

使用下面命令列出所有的按鍵與按鍵內容

stty -a

不建議修改

6 資料流重定向

資料流重定向:將某個命令執行後應該出現在螢幕上的資料傳輸到其他的地方,例如檔案或裝置(印表機)。

6.1 標準輸出(stdout):>或>>

例如,將/下各目錄的檔名,許可權和屬性記錄到~/rootfile檔案中:

[root@h2 ~]# ll / > ~/rootfile
[root@h2 ~]# cat rootfile 
total 108
drwxr-xr-x   6 root root  4096 Nov  8 19:32 apps
dr-xr-xr-x.  2 root root  4096 Nov  6 15:05 bin
dr-xr-xr-x.  4 root root  4096 Aug 14  2014 boot
drwxr-xr-x  10 root root  4096 Nov  6 15:06 cgroup
drwxr-xr-x  16 root root  3360 Jul 16 13:42 dev
drwxr-xr-x. 90 root root  4096 Nov 23 20:02 etc
drwxr-xr-x.  4 root root  4096 Jul 16 14:50 home
dr-xr-xr-x. 10 root root  4096 Sep 26 20:35 lib
dr-xr-xr-x.  9 root root 12288 Nov  6 15:05 lib64
drwx------.  2 root root 16384 Aug 14  2014 lost+found
drwxr-xr-x.  2 root root  4096 Sep 23  2011 media
drwxr-xr-x.  2 root root  4096 Sep 23  2011 mnt
drwxr-xr-x.  5 root root  4096 Nov  6 15:14 opt
dr-xr-xr-x  94 root root     0 Jul 16 21:41 proc
dr-xr-x---. 16 root root  4096 Nov 24 13:43 root
dr-xr-xr-x.  2 root root 12288 Nov  6 15:05 sbin
drwxr-xr-x.  2 root root  4096 Aug 14  2014 selinux
drwxr-xr-x.  2 root root  4096 Sep 23  2011 srv
drwxr-xr-x  13 root root     0 Jul 16 21:41 sys
drwxrwxrwt. 62 root root  4096 Nov 23 16:00 tmp
drwxr-xr-x. 14 root root  4096 Nov 20 20:28 usr
drwxr-xr-x. 23 root root  4096 Mar 21  2017 var
drwxr-xr-x   3 root root  4096 Oct 28  2015 yjdata

注意:
- 若該檔案(上面是~/rootfile)不存在,系統則自動建立該檔案;
- 若存在,那麼使用>時系統會現將該檔案內容清空,再寫入資料;
- 若想追加而不想覆蓋,可以使用>>。

6.2 標準錯誤輸出(stderr):2>或2>>

標準錯誤輸出:執行命令失敗時返回的錯誤資訊,例如讀取某個不存在的檔案時,螢幕上顯示錯誤資訊。

[root@h2 ~]# cat haha
cat: haha: No such file or directory

將錯誤資訊記錄到~/errfile檔案中:

[root@h2 ~]# cat haha 2> errfile
[root@h2 ~]# cat errfile 
cat: haha: No such file or directory

同理,若想追加而不是覆蓋,可以使用2>>。

/dev/null:垃圾桶黑洞

  在Linux系統中“find”命令是大多數系統使用者都可以使用的命令,並不是ROOT系統管理員的專利。但是普通使用者使用“find”命令時也有可能遇到這樣的問題,那就是Linux系統中系統管理員ROOT可以把某些檔案目錄設定成禁止訪問模式。這樣普通使用者就沒有許可權用“find”命令來查詢這些目錄或者檔案。當普通使用者使用“find”命令來查詢這些檔案目錄是,往往會出現”Permissiondenied.”(禁止訪問)字樣。系統將無法查詢到你想要的檔案。為了避免這樣的錯誤,我們可是使用轉移錯誤提示的方法嘗試著查詢檔案,輸入:

find / -name 檔案 2>/dev/null

  這個方法是把查詢錯誤提示轉移到特定的目錄中去。系統執行這個命令後,遇到錯誤的資訊就直接輸送到stderrstream 2 中,access_log 2就是表明系統將把錯誤資訊輸送到stderrstream 2中,/dev/null是一個特殊的檔案,表明空的或者錯誤的資訊,這樣查詢到的錯誤資訊將被轉移了,不會再顯示了。

例如:以下以非root使用者登入

[[email protected] ~]$ find /home -name .bashrc
find: `/home/jack': Permission denied #標準錯誤輸出
/home/hadoop/.bashrc
find: `/home/hadoop/apps/hadoop-2.6.4/data/tmp/nm-local-dir/nmPrivate': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/hadoop-2.6.4/data/tmp/dfs/data': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/lib': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/work': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/temp': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/conf': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/webapps': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/logs': Permission denied #標準錯誤輸出
find: `/home/hadoop/apps/tomcat/bin': Permission denied #標準錯誤輸出

將錯誤資訊丟棄,螢幕上只顯示正確的資料:

[hadoop@h2 ~]$ find /home -name .bashrc 2> /dev/null
/home/hadoop/.bashrc

可以將正確資訊與錯誤資訊分別寫入檔案

[hadoop@h2 ~]$ find /home -name .bashrc >right  2> /dev/null
[hadoop@h2 ~]$ cat right 
/home/hadoop/.bashrc

可以將正確資訊和錯誤資訊同時寫入檔案

[hadoop@h2 ~]$ find /home -name .bashrc >all  2> all  #錯誤!次序錯亂!
[hadoop@h2 ~]$ find /home -name .bashrc >all  2>&1 #正確

6.3 標準輸入(stdin):<和<<

標準輸入:將原本需要由鍵盤輸入的資料改為由檔案內容來替代。

7 管道命令(pipe)

image

Command1正確輸出,作為Command2的輸入 然後Command2的輸出作為,Command3的輸入 ,Command3輸出就會直接顯示在螢幕上面了。

通過管道之後:Command1,Command2的正確輸出不顯示在螢幕上面

注意:

  • 管道命令只處理前一個命令正確輸出,不處理錯誤輸出。
  • 管道命令右邊命令,必須能夠接收標準輸入流命令才行(less,more,head,tail,grep都可以,而ls,cp,mv不行)。

7.1 選取命令:cut,grep

選取命令:將一段資料經過分析後,取出我們想要的(一般以行來分析)。
1. cut:切分,處理資訊是按照“行”為單位。格式:

cut -d '分割字元' -f '保留第幾段'  #分割字串
cut -c 字元範圍   #用於排列整齊的資訊

例如:以“:”分割,得到第3段

[root@h2 ~]# echo $CLASS_PATH
.:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib
[root@h2 ~]# echo $CLASS_PATH |cut -d ':' -f 3 
/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar

以“:”分割,得到第2段和第4段

[[email protected] ~]# echo $CLASS_PATH |cut -d ':' -f 2,4
/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib

export後顯示的資料排列整齊

[[email protected] ~]# export
declare -x CATALINA_BASE="/usr/local/tomcat"
declare -x CLASS_PATH=".:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib"
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HADOOP_HOME="/home/hadoop/apps/hadoop-2.6.4"
declare -x HBASE_HOME="/home/hadoop/apps/hbase"
省略...

我們將export輸出的資訊取得第12字元以後的所有字串
[[email protected] ~]# export | cut -c 12-

CATALINA_BASE="/usr/local/tomcat"
CLASS_PATH=".:/usr/lib/jvm/jdk1.8.0_151/lib/dt.jar:/usr/lib/jvm/jdk1.8.0_151/lib/tools.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib"
CVS_RSH="ssh"
G_BROKEN_FILENAMES="1"
HADOOP_HOME="/home/hadoop/apps/hadoop-2.6.4"
HBASE_HOME="/home/hadoop/apps/hbase"
HISTCONTROL="ignoredups"
HISTSIZE="1000"
HIVE_HOME="/home/hadoop/apps/hive"

也可以取得某個範圍的資料,例如:

export | cut -c 12-20
CATALINA_
CLASS_PAT
CVS_RSH="
G_BROKEN_
HADOOP_HO
HBASE_HOM
省略...
  1. grep:分析一行資訊,若有所需資訊,就將這行拿出來
    格式:
grep [-acinv] [--color=auto] '要查詢的字串' 檔名
-a:將binary檔案以text檔案方式查詢資料;
-c:計算找到'要查詢的字串'的次數;
-i:忽略大小寫;
-n:輸出行號;
-v:反向選擇,即顯示沒有'要查詢的字串'的那一行;
--color=auto:找到的字串加上顏色顯示

例如:

[root@h2 ~]# last |grep -in  --color=auto  Hadoop #下面的hadoop其實是有顏色的
1:hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
73:hadoop   pts/1        218.2.216.24     Sun Nov  5 16:46 - 16:46  (00:00)    
110:hadoop   pts/0        218.94.83.137    Sat Aug  5 11:37 - 11:37  (00:00)    
128:hadoop   pts/8        117.136.67.14    Fri Jul 21 13:45 - 13:46  (00:01)    
234:hadoop   pts/1        218.2.216.18     Thu Apr 20 21:30 - 22:07  (00:36)    
235:hadoop   pts/1        218.2.216.18     Thu Apr 20 20:04 - 20:18  (00:13)    
236:hadoop   pts/0        218.94.83.133    Thu Apr 20 17:22 - 21:54  (04:32)    
237:hadoop   pts/1        218.94.83.133    Thu Apr 20 17:16 - 17:21  (00:05)

7.2 排序命令:sort,uniq,wc

  1. sort
sort [-bcfMnrtk][檔案]
-b   忽略每行前面開始出的空格字元。
-c   檢查檔案是否已經按照順序排序。
-f   排序時,忽略大小寫字母。
-M   將前面3個字母依照月份的縮寫進行排序。
-n   依照數值的大小排序。
-o<輸出檔案>   將排序後的結果存入指定的檔案。
-r   以相反的順序來排序。
-t<分隔字元>   指定排序時所用的欄位分隔字元。
-k  選擇以哪個區間進行排序。

例如:將/etc/passwd內容以:分隔,使用第三列來排序

[root@h2 ~]# cat /etc/passwd |sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
省略...

若要以數字排序,可以加上-n

[root@h2 ~]# cat /etc/passwd |sort -t ':' -k 3 -n
  1. uniq:將重複的資料僅列出一個顯示,格式:
uniq [-ic]
-i:忽略大小寫
-c:統計次數

例如:使用last將賬戶列出,僅取賬戶第一列,除去重複,統計次數

[[email protected] ~]# last |cut -d ' ' -f 1 |uniq -c
      1 hadoop
     71 root
      1 hadoop
     36 root
      1 hadoop
     16 root
      1 jack
      1 hadoop
      1 root
      1 jack
      省略...

使用last將賬戶列出,僅取賬戶第一列,進行排序後去除重複並統計次數

[root@h2 ~]# last |cut -d ' ' -f 1 |sort|uniq -c
      1 
      8 hadoop
     13 jack
     11 reboot
    271 root
      1 wtmp
  1. wc:統計檔案(行,字數,字元數),格式:
wc [-lwm]
-l:僅列出行
-w:僅列出多少字(英文單字)
-m:多少字元

例如,統計/etc/man.config裡面多少字、行、字元數

[root@h2 ~]# cat /etc/man.config |wc
    152     765    4940
    #輸出的三個數字分別代表行、字數、字元數

統計目前有多少個賬戶( /etc/passwd中一行代表一個賬戶)

[root@h2 ~]# cat /etc/passwd |wc -l
32

7.3 雙向重定向:tee

tee命令用於將資料重定向到檔案,另一方面還可以提供一份重定向資料的副本作為後續命令的stdin。簡單的說就是把資料重定向到給定檔案和螢幕上。
image
例如:我們將last的輸出一份存到last.txt檔案中,一份打印出來

[[email protected] ~]# last | tee last.txt
root     pts/2        218.94.83.137    Fri Nov 24 19:01   still logged in   
hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
root     pts/1        218.94.83.137    Fri Nov 24 13:01   still logged in   
省略...
[[email protected] ~]# cat last.txt 
root     pts/2        218.94.83.137    Fri Nov 24 19:01   still logged in   
hadoop   pts/2        218.94.83.137    Fri Nov 24 13:53 - 14:20  (00:27)    
root     pts/1        218.94.83.137    Fri Nov 24 13:01   still logged in   
省略...

7.4 字元裝換命令:tr,col,join,paste,expand

  1. tr:刪除或壓縮重複字元,格式:
tr [ds] 字串
-d:刪除字串
-s:把連續重複的字元以單獨一個字元表示

例如:將小寫轉大寫

[[email protected] ~]# cat err
cat: 123: No such file or directory
[[email protected] ~]# cat err| tr '[a-z]' '[A-Z]'
CAT: 123: NO SUCH FILE OR DIRECTORY

使用tr刪除字元:

[[email protected] ~]# echo "hello 123 world 456" | tr -d '0-9'
hello  world

用tr壓縮字元,可以壓縮輸入中重複的字元:

[root@h2 ~]# echo "thissss is a text linnnnnnne." | tr -s ' sn'
this is a text line.
  1. col:過濾控制符
  2. join:看字面上的意義 (加入/參加) 就可以知道,他是在處理兩個檔案之間的資料, 而且,主要是在處理兩個檔案當中,有 “相同資料” 的那一行,才將他加在一起的意思。

 例如:用 root 的身份,將 /etc/passwd 與 /etc/shadow 相關資料整合成一欄

[root@h2 ~]# head -n 3 /etc/passwd /etc/shadow
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

==> /etc/shadow <==
root:$6$8TvfjgX7$EFjOxLuaxkc47x/JSaz6LSvxBtMay9Vji6NEynj2mVBuJhLt6F1wSuhWVBJQIVbJjBpjFS4gE1L.mk9.VDKq41:17361:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::

# 由輸出的資料可以發現這兩個檔案的最左邊欄位都是賬號!且以 : 分隔
[root@h2 ~]# join -t ':' /etc/passwd /etc/shadow
root:x:0:0:root:/root:/bin/bash:
            
           

相關推薦

LinuxBASH的特性

bash linux Shell本身是應用程序,是用戶與操作系統之間完成交互式操作的一個接口程序,為用戶提供簡化的操作。 Bourne Again Shell,簡稱bash,是Linux系統中默認的shell程序。Bash的特性: 一、命令的別名(自定義命令) alias(內嵌命令),

linux bash shell terminal的解釋

bash shell terminalshell:是內核的一個外層保護工具,並負責完成用戶與內核之間的交互; 提供了用戶與內核進行交互操作的一種接口,它接收用戶輸入的命令並把它送入內核去執行。 是一個命令行解釋器,解釋由用戶輸入的命令並把它們送入內核去執行。

Linuxbash的一些命令

Linux——bash的簡單使用 bash及其特性: 1、bash實質上是一個可執行的程式,一個使用者的工作環境。 2、每一個shell下可以再開啟一個shell,新開啟的shell稱為子shell,每一個shell之間相互獨立。 3、可以使用pstree命令檢視當前shell下的子shell個數

Linuxbash

1 檢視可以使用的shell cat /etc/shells 系統預設使用的是bash,有幾個好處: 1. 命令記憶功能(history) 2. 自動補全 3. 別名設定:alias 4. 萬用字元 2 檢視命令是內建還是外部

Linux Shell Bash 變數賦值 的作用

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linuxbash 的 second SECOND SECONDS

:$  echo $SECONDS  #當前系統執行時間 :$ 6643   #單位s 在一個shell指令碼中執行的話,每一次SECONDS從0開始,無需定義和read. bash預設SECONDS從0開始計時. 在這裡我們用一個例子進行說明,使

教你一些Linux隱藏bash歷史命令的小技巧

導讀 如果你登入過 Linux 系統,並敲過一些命令,那你應該知道,bash history 會記錄你輸入的所有命令。這個操作其實是有一定風險的。 我個人經常使用 Linux,所以我想著研究一番,看看如何隱藏 bash history。下

解決:-bash: unzip: command not found (Linux unZip/Zip 的安裝及使用)(轉)

【轉自:http://ju.outofmemory.cn/entry/315349】 Linux系統沒有自帶的壓縮解壓工具;需要我們自己安裝; 當用到zip或者unzip如果沒有安裝就會出現 unzip: Command Not Found 或 zip: Command Not Found

10 個 Linux 方便的 Bash 別名

你有多少次在命令列上輸入一個長命令,並希望有一種方法可以儲存它以供日後使用?這就是 Bash 別名派上用場的地方。它們允許你將長而神祕的命令壓縮為易於記憶和使用的東西。需要一些例子來幫助你入門嗎?沒問題! 要使用你建立的 Bash 別名,你需要將其新增到 .bas

Linux Shell Bash 變數賦值 的作用

  1 #!/bin/bash  2 # "裸體"變數  3   4 echo  5   6 # 變數什麼時候是"裸體"的, 比如前邊少了$的時候?  7 # 當它被賦值的時候, 而不是被引用的時候.  8   9 # 賦值 10 a=879 11 echo "The value of \"a\" is $a

Linux編寫Bash指令碼的10個技巧

Shell 指令碼程式設計 是你在 Linux 下學習或練習程式設計的最簡單的方式。尤其對 系統管理員要處理著自動化任務,且要開發新的簡單的實用程式或工具等(這裡只是僅舉幾例)更是必備技能。 本文中,我們將分享 10 個寫出高效可靠的 bash 指令碼的實用技巧,它們包括: 1、 指令碼中多寫註釋 這是

Linux編寫Bash腳本的10個技巧

oot .cn 註意 src 使用 art 模塊化 工作 set Shell 腳本編程 是你在 Linux 下學習或練習編程的最簡單的方式。尤其對 系統管理員要處理著自動化任務,且要開發新的簡單的實用程序或工具等(這裏只是僅舉幾例)更是必備技能。 本文中,我們將分享 10

Linux Shell Bash 變數賦值"$()"的作用

轉載:http://www.360doc.com/content/10/0303/16/155970_17438894.shtml 例子 4-2. 簡單的變數賦值 1 #!/bin/bash 2 # "裸體"變數 3  4 echo 5  6 

[Linux] Linux 的基本命令與目錄結構(初稿)

展開 src 文件名 auto 使用 bin target editor 提示符 Linux 中的基本命令與目錄結構 目錄 一、Linux 基本目錄結構 二、基本命令 三、瀏覽目錄 四、中間命令 五、更改密碼 六、環境變量和 shell 變量 七、命令路

[Linux] Linux 的基本命令與目錄結構(待移除)

head 命令 存在 壓縮 下載 創建文件 name 批處理 targe 簡化 Linux 中的基本命令與目錄結構 目錄 一、Linux 基本目錄結構 二、基本命令 三、瀏覽目錄 四、中間命令 五、更改密碼 六、環境變量和 shell 變量 七、命令路徑

Linux Shell——bash shell 腳本簡介

運行環境 linux 關鍵字 程序 單詞 bash shell 腳本簡介shell 運行環境如果你運行的是 Unix 或 Linux 系統,例如 Ubuntu,Red Hat,SUSE Linux,還有macOS,都是內置了 bash shell 的,所以你不需要額外配置所謂的開發

Linuxwget用法

wordpress 用戶名 targe 是否 之前 get robot c斷點續傳 常用語法 Wget簡介:Linux系統中wget是一個下載文件的工具,它用在命令行下。對於Linux用戶是必不可少的工具,我們經常要下載一些軟件或從遠程服務器恢復備份到本地服務器。wget支

linux的strip命令簡介------給文件脫衣服

toc stdin -c processor 進行 localhost lib 比較 main.c 1、去掉-g,等於程序做了--strip-debug2、strip程序,等於程序做了--strip-debug和--strip-symbol 作為一名Linux開發人員

Linux進程的優先級

this 優先 命令 fault sch proc valid nic lin Linux採用兩種不同的優先級範圍,一種是nice值。還有一種是實時優先級。 1.nice值 nice值得範圍是-20~19,默認值是0。越大的nice值意味著更低的優先級。也就是說nice

Linux進程與線程及CPU使用率查詢

mage images logs alt 技術 cat png rgs img 一、進程查詢:   ps -e -o ‘pid,comm,args,pcpu,rsz,vsz,stime,user,uid‘   說明:PCPU是Cpu使用率,8核最多是800。