點擊關注 異步圖書,置頂公眾號
參與文末話題,得異步新書
Linux下的命令到底有多少?大部分人可能都不清楚。其中有一些命令是大多數系統中都包含的,這些命令基本上都包含在GNU Coreutils包中。
當然,還有一些命令不包含在Coreutils包中,而是存在於一些基本且實用的軟體中,如sed、awk和grep等。
很多用戶可能只用過其中的部分命令,而且可能只掌握了這部分命令的部分功能。
很多Linux初學者面對這麼多的命令往往不知道如何入手,於是就產生了如何學習Linux命令的疑問——到底哪些命令、哪些參數有用?
Linux系統指令目前有3000個左右,而且隨著作業系統版本的不斷升級,命令數量會越來越多。這樣規模龐大的命令群很容易造成Linux初學者手忙腳亂,甚至一些擁有多年Linux運維經驗的人員有時也需要到網絡上去查詢一些命令。
因此,作者就萌生了編寫本書的想法,將自己多年運維工作過程中學習和積累的非常實用的命令整理出來,希望對廣大的Linux初學者和有一定經驗的應用運維從業者有所幫助和助益。
一般所說的「命令行」是指Linux中直接操縱作業系統的底層命令,Linux命令是對Linux系統進行管理的命令。其實,命令行就是溝通的語言,就像人與人之間溝通使用的語言。
用戶和Linux內核之間溝通也需要一個雙方都可以明白的語言,這就是命令行,用戶輸入命令後,內核就會明白用戶要讓它做什麼。
如果一時無法理解這些概念性的東西,也沒有關係,因為隨著命令行知識的不斷積累,加上不斷的練習,讀者就會構建自己的知識體系,逐漸理解和掌握。
下面來解釋為什麼要熟練掌握命令行操作。
1.1.1 命令行執行速度快命令行執行速度基於毫秒,非常之快。如此快的執行速度,意味著我們在使用腳本執行一般性的任務時,返回結果的速度同樣會非常快,這是命令行的優勢之一。
【實例1-1】命令行執行速度演示
[root@linux_command ~]# ping qq.com -c 3
PING qq.com (14.17.32.211) 56(84) bytes of data.
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=1 ttl=53 time=33.8 ms
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=2 ttl=53 time=33.5 ms
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=3 ttl=53 time=33.6 ms
--- qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 33.586/33.678/33.839/0.240 ms
[root@linux_command ~]# ping qq.com -c 3 -w 3
PING qq.com (14.17.32.211) 56(84) bytes of data.
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=1 ttl=53 time=33.6 ms
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=2 ttl=53 time=33.4 ms
64 bytes from 14.17.32.211 (14.17.32.211): icmp_seq=3 ttl=53 time=33.4 ms
--- qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 33.459/33.541/33.686/0.234 ms
上述代碼中,ping命令返回的結果均在毫秒級別。
1.1.2 命令行針對結果命令行界面沒有圖形界面煩瑣的「下一步」之類的操作,直接返回結果,乾淨利落。
下面的代碼演示了查看當前登錄伺服器主機用戶是誰,命令直接給出執行結果,即當前登錄的用戶是root,簡單明了。
【實例1-2】命令行返回結果精準演示
whoami
輸出當前作業系統的用戶名。
[root@linux_command ~]# whoami
root
【實例1-3】列印伺服器CPU的信息
cat/proc/cpuinfo
用於列印伺服器CPU(中央處理器)的所有指標信息。
[root@linux_command ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel Core Processor (Broadwell)
stepping : 2
microcode : 0x1
cpu MHz : 2099.996
cache size : 4096 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_
tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic
movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm
3dnowprefetch fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bogomips : 4199.99
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management :
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel Core Processor (Broadwell)
stepping : 2
microcode : 0x1
cpu MHz : 2099.996
cache size : 4096 KB
physical id : 1
siblings : 1
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat
pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good
nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt
tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
bogomips : 4199.99
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
從上述代碼中可以看到,中央處理器命令行返回(CPU)信息精準直觀。
1.1.3 命令行反饋信息明確命令行在執行過程中如果出錯,就直接拋出錯誤;如果執行正確,那麼默認什麼都不返回。在信息的反饋力度和準確性方面毋庸置疑,非常乾脆,這正是系統維護人員應該具備的素質和技術素養。
下面的指令判斷/etc/passwd文件是否存在,如果存在,則列印「File Exists...」;如果不存在,則列印「File not Exists...」。
【實例1-4】判斷文件是否存在
[root@linux_command ~]# [ -f /etc/passwd ] && echo 'File Exists...' || echo 'File not exists...'
File Exists...
從上述例子中可以看出,信息反饋非常明確。
下面的命令執行成功後,會返回數字0,其中,seq 10指令表示列印1~10的數字序列。
【實例1-5】命令執行成功返回數字0
[root@linux_command ~]# seq 10
[root@linux_command ~]# echo $?
0
在下面的代碼演示中,命令執行失敗後,返回結果為非0數字。
【實例1-6】命令執行失敗返回非0數字
[root@linux_command ~]# seq abc
seq: invalid floating point argument: abc
Try 'seq --help' for more information.
[root@linux_command ~]# echo $?
1.1.4 命令行便於調試命令行的報錯信息一般都是比較直觀的。另外,我們平時在編寫Shell腳本的時候,一般都是多個腳本獨立編寫,這樣的好處是便於調試,也符合Linux系統本身的設計特點,目的就是體現「組合單一專用命令,完成複雜任務」的思想。因此,這也是我們在學習Shell腳本編寫過程中非常重要的一個思想。
【實例1-7】for循環列印1~15的數字序列
[root@linux_command ~]# for num in $(seq 15);do echo $num;done
也可以採用下面的寫法,和上面輸出的結果是一致的。
[root@www.ansible.com ~]# for num in {1..15};do echo -e "\033[32;40m${num}\033[0m";done
核心代碼解析:
echo {1..15}
和下面的代碼結果一致,表示1~15的數字序列。
echo `seq 15`
echo $(seq 15)
下面來看如果命令行寫錯了,該怎麼處理。
【實例1-8】命令執行失敗演示
[root@linux_command ~]# for num in $(seq 15);do echo $num;;done
-bash: syntax error near unexpected token `;;'
上述代碼中多了一個分號,從代碼的報錯提示中可以看到,信息提示非常準確,立刻就能識別是哪裡出了問題。
Windows作業系統更加側重圖形界面操作,更適合一般的用戶,而對於追求效率和功能性的Linux系統運維工程師而言,命令行是他們的明智之選。
何以見得?可以通過下文的例子進行說明。
1.2.1 快速文件操作快速文件操作主要是指在日常運維過程中對文件的複製、粘貼和移動。下面分別介紹在圖形界面和命令行中操作文件的步驟。
1.圖形界面中的文件操作圖1-1 源文件夾和目標文件夾準備文件夾
圖1-2 準備複製圖片文件
[root@linux_command ~]#cp /path/filename /path/dest
上述命令同樣可以完成文件的複製操作,而且只需要一步(一條指令即可完成文件複製操作)。
圖1-3 打開目標文件夾
圖1-4 複製到目標文件夾
【實例1-9】命令行文件操作演示
[root@linux_command ~]# cp -av /etc/passwd /tmp
'/etc/passwd_command ~]# cp -av[root@linux_command ~]# ls -la /tmp/passwd
-rw-r--r--. 1 root root 1444 Aug 23 20:48 /tmp/passwd
上述代碼複製/etc/passwd文件到/tmp目錄下。
1.2.2 快速操作軟體Windows作業系統中安裝軟體通常需要經歷如下3個步驟。
而在Linux命令行中安裝軟體,只需要一個步驟即可完成。
【實例1-10】命令行中安裝httpd軟體操作演示
yum -y install httpd
上述代碼中,一條命令即可完成httpd軟體的安裝工作。
1.2.3 快速條件搜索快速條件搜索在Windows作業系統中通常需要經歷下面3個步驟。
Windows作業系統本身的搜索能力有限,主要體現在搜索條件的匹配及搜索速度方面,如果需要更為強大的搜索功能,可能需要藉助圖1-5所示的第三方搜索軟體。
圖1-5所示的軟體功能很強大,例如搜索當前計算機中的所有以CentOS開頭,中間是任意字符結尾是ISO鏡像文件(*.iso為正則表達式的描述方法),如圖1-6所示。
圖1-5 搜索軟體
圖1-6 查找ISO鏡像文件
而在Linux中,功能強大的find命令可以支持各種形式的搜索,其中包含尤其強大的正則表達式。
find /root -name [文件名] 根據文件名搜索(嚴格匹配)
find /root -iname [文件名] 不區分大小寫
find /root -user [所有者名] 根據所有者來搜索
find /root -size +100M 根據大小搜索
find /root -size +100k -a -size -50M 範圍搜索
find /root -size +100k -a -size -50M -exec ls -lh {} \;
上述代碼中,使用find命令可以針對文件名、文件所有者、權限、文件大小等進行快速搜索,可見命令行功能之強大。
通過一條find命令就可以達到搜索的目的,不僅快捷,而且功能比圖形界面更加強大。
這樣的例子其實還有很多,從開發的角度來說,命令行為Linux應用運維或者高級運維帶來了不少好處。下面以3個實例來說明命令行在速度及便捷性方面的優勢。
【實例1-11】查找根目錄下名為passwd的文件,不區分大小寫
find/-iname passwd
查找當前系統中根目錄下,不區分大小寫,名稱為passwd的文件。
[root@linux_command ~]# find / -iname passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/passwd
/etc/pam.d/passwd
/tmp/passwd
/tmp/PASSWD
/usr/bin/passwd
上述代碼中,「-iname」選項表示不區分大小寫。
【實例1-12】查找根目錄下名為passwd的文件
find/-iname passwd
查找當前系統中根目錄下,名稱為passwd的文件。
[root@linux_command ~]# find / -name passwd
/sys/fs/selinux/class/passwd
/sys/fs/selinux/class/passwd/perms/passwd
/etc/passwd
/etc/pam.d/passwd
/tmp/passwd
/usr/bin/passwd
上述代碼中,「-name」選項代表查找根目錄下名為passwd的文件。
【實例1-13】查找/data目錄下,以「*.log」作為結尾並且是20天以前的所有文件。
find /data/ -type f –name "*.log" –mtime +20
查找當前系統中/data/目錄下,名稱為「*.log」結尾,時間是20天以前的文件。
[root@linux_command ~]# find /data/ -type f -name "*.log" -mtime +20
/data/sh/shell/grep.log
/data/1.log
/data/2.log
/data/3.log
/data/4.log
/data/5.log
/data/6.log
/data/7.log
/data/8.log
/data/9.log
上述代碼中有以下幾個條件。
作者多年工作實踐經驗的總結,全方位系統地解讀Linux運維之道,帶你輕鬆從入門到精通。
本書特點
(1)模擬企業環境,實用至上。全書內容是作者近 10 年工作經驗的總結,耗時約 500個日夜完成。書中的每個章節都精選了近百個實例,作者對每個實例進行逐步分解、進化、升級修訂,讀者根據需要做簡單修改後,即可在企業級Linux運維生產環境部署應用。
(2)結構合理,圖文並茂。每個章節採用循序漸進的方式進行講解,由淺入深、逐步引導,讓讀者更容易接受和吸收書中的知識。尤其對於初學者,入門學習時就能得到來自一線企業實戰的技術分享,想必是一件十分愉悅的事情吧!每章結尾都有總結和思維導圖,供讀者複習,在梳理知識的同時能夠明確每章的架構和層次,使讀者輕鬆入門Linux。
(3)網絡及技術支持。讀者在遇到問題時,可以及時聯繫作者,作者會儘可能地給予讀者全方位的免費技術支持。