Linux命令基礎(chǔ)使用

1.基礎(chǔ)知識(shí)
當(dāng)我們打開(kāi)終端時(shí),終端軟件會(huì)為我們打開(kāi)一個(gè)shell軟件,這個(gè)shell會(huì)顯示一個(gè)提示符,然后等待用戶輸入命令,類似下面這個(gè):
然后我們就可以在這個(gè)界面中執(zhí)行Linux命令了,shell做為一個(gè)命令解釋器,它會(huì)解釋并執(zhí)行用戶輸入的命令。
這種shell有多種,如sh、csh、tcsh、zsh、fish、bash,而目前Linux環(huán)境中使用得最廣泛的就是bash。
2.命令參數(shù)與選項(xiàng)
Linux命令基本都是如下的形式:
cat -n temp.txt
這個(gè)命令表示輸出temp.txt的內(nèi)容,同時(shí)包含行號(hào),其中,cat是命令程序,-n是選項(xiàng),而temp.txt
則是命令參數(shù)。
一般來(lái)說(shuō),選項(xiàng)用來(lái)控制命令的行為,參數(shù)用來(lái)給命令輸入數(shù)據(jù)。
3.標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤
命令除了參數(shù)與選項(xiàng)外,還有標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤這3個(gè)概念,如下:
標(biāo)準(zhǔn)輸入
同樣是用來(lái)給命令輸入數(shù)據(jù),它與命令參數(shù)的區(qū)別是,參數(shù)一般是一個(gè)(或多個(gè))簡(jiǎn)短的文本值,而標(biāo)準(zhǔn)輸入是一個(gè)輸入流,命令可從其中讀取大量數(shù)據(jù),類似java的System.in。
cat < temp.txt
它等效于cat temp.txt
,但本質(zhì)卻是不同的,cat temp.txt
是cat這個(gè)程序內(nèi)部會(huì)去讀取temp.txt
文件的內(nèi)容,cat是知道它在讀取temp.txt
的,而cat < temp.txt是cat這個(gè)程序在讀取標(biāo)準(zhǔn)輸入中的數(shù)據(jù),至于標(biāo)準(zhǔn)輸入中的數(shù)據(jù)從何而來(lái),cat是不知道的。
同時(shí),Linux命令中也經(jīng)常使用 - 這個(gè)特殊的文件名來(lái)表示標(biāo)準(zhǔn)輸入文件,如下四個(gè)命令是等效的:
# cat不指定輸入文件時(shí),默認(rèn)就讀取標(biāo)準(zhǔn)輸入 cat # cat認(rèn)為 - 代表標(biāo)準(zhǔn)輸入文件 cat - # /dev/stdin是具體的標(biāo)準(zhǔn)輸入文件 cat /dev/stdin # 指定讀取0(標(biāo)準(zhǔn)輸入)這個(gè)文件描述符 cat <&0
標(biāo)準(zhǔn)輸出
每個(gè)命令都有一個(gè)標(biāo)準(zhǔn)輸出,這個(gè)類似標(biāo)準(zhǔn)輸入,也是一個(gè)流,不過(guò)它是用來(lái)給命令向外部輸出數(shù)據(jù)的,默認(rèn)是屏幕,它類似java
的System.out
。如下:
# 命令默認(rèn)寫出內(nèi)容到標(biāo)準(zhǔn)輸出 echo hello | cat # 顯示指定寫到標(biāo)準(zhǔn)輸出文件 echo hello | cat > /dev/stdout
另外,在有些命令中,也會(huì)使用-來(lái)代表標(biāo)準(zhǔn)輸出文件。
標(biāo)準(zhǔn)錯(cuò)誤
標(biāo)準(zhǔn)錯(cuò)誤概念上和標(biāo)準(zhǔn)輸出類似,不過(guò)它是用來(lái)程序報(bào)告錯(cuò)誤的,類似java
的System.err
。
如下:
# 顯示指定寫到標(biāo)準(zhǔn)錯(cuò)誤文件 echo hello | cat > /dev/stderr
4.管道
管道的作用是把命令之間連接起來(lái),讓它們之間可以傳遞數(shù)據(jù),上面其實(shí)已經(jīng)見(jiàn)過(guò)管道,如下:
echo hello | cat
echo
程序?qū)ello寫到標(biāo)準(zhǔn)輸出,| 將echo的標(biāo)準(zhǔn)輸出與cat的標(biāo)準(zhǔn)輸入連接起來(lái),前面標(biāo)準(zhǔn)輸出寫出什么數(shù)據(jù),| 就會(huì)將這個(gè)數(shù)據(jù)傳到后面程序的標(biāo)準(zhǔn)輸入,行為就像管道一樣。
默認(rèn)情況下,管道只能將前面的標(biāo)準(zhǔn)輸出傳遞給后面的程序,如果想將標(biāo)準(zhǔn)錯(cuò)誤也傳遞給后面程序,可以使用|&
# 標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤都通過(guò)管道傳遞給cat echo hello |& cat # 與上面等價(jià) echo hello 2>&1 | cat
5.重定向
輸入重定向,將文件內(nèi)容重定向?yàn)槌绦虻臉?biāo)準(zhǔn)輸入
cat < temp.txt
也是輸入重定向,可即時(shí)輸入多行文本,bash
的Here Document
語(yǔ)法
cat <<EOF hello,java hello,bash EOF <<<
也是輸入重定向,可即時(shí)輸入一行文本,bash
的Here String
語(yǔ)法
cat <<<hello >
標(biāo)準(zhǔn)輸出內(nèi)容重定向到文件,覆蓋寫入
echo hello | cat > temp.txt >>
標(biāo)準(zhǔn)輸出內(nèi)容重定向到文件,追加寫入
echo hello | cat >> temp.txt >&2
標(biāo)準(zhǔn)輸出內(nèi)容重定向到標(biāo)準(zhǔn)錯(cuò)誤
echo hello >&2 # 其實(shí)也可以寫成這樣 echo hello 1>&2 2>&1
標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出
# 標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤都重定向到app.log,注意2>&1要放在后面 echo hello | cat > app.log 2>&1 # 簡(jiǎn)寫形式,與上面等價(jià) echo hello | cat &> app.log
6.管道與重定向揭秘
程序中使用文件描述符來(lái)引用一個(gè)文件,類似java中的File對(duì)象,但它是一個(gè)數(shù)字,又有點(diǎn)像指針,這個(gè)指針指向具體的文件。
而linux中,0就是標(biāo)準(zhǔn)輸入的文件描述符,1就是標(biāo)準(zhǔn)輸出的文件描述符,2就是標(biāo)準(zhǔn)錯(cuò)誤的文件描述符
重定向本質(zhì)是改變文件描述符的指向,如下:
1、執(zhí)行cat命令后,在另一個(gè)shell中查看此cat的文件描述符,發(fā)現(xiàn)1標(biāo)準(zhǔn)輸出指向/dev/pts/1。
2、結(jié)束cat,我們?cè)賵?zhí)行cat > temp.txt,在另一個(gè)shell中查看此cat的文件描述符,發(fā)現(xiàn)1標(biāo)準(zhǔn)輸出這個(gè)文件描述符指向了/tmp/temp.txt,所以,懂了么~
管道本質(zhì)是創(chuàng)建一個(gè)臨時(shí)管道文件,將前面程序的1標(biāo)準(zhǔn)輸出指向這個(gè)臨時(shí)文件,后面程序的0標(biāo)準(zhǔn)輸入也指向這個(gè)臨時(shí)文件,如下:
1、執(zhí)行cat|cat命令
2、不要退出,在另一個(gè)shell中查看這兩個(gè)cat的文件描述符,如下:
注:shell會(huì)默認(rèn)為管道符 | 創(chuàng)建臨時(shí)管道文件,如果有需要你也可以通過(guò)mkfifo顯示創(chuàng)建管道文件。
注:只執(zhí)行一個(gè)cat后,命令在等待輸入流的數(shù)據(jù),所以看起來(lái)卡住了,這時(shí)可以使用Ctrl + d來(lái)退出,這和Ctrl + c是不同的,Ctrl + d作用類似于EOF信號(hào),而Ctrl + c是中斷了進(jìn)程。
7.Linux命令分類
基礎(chǔ)命令
(cd ls cp mv rm pwd du df tree find locate touch stat basename dirname realpath tar)
文本命令
(echo printf seq yes tee date time dos2unix iconv bc sleep watch true)
(find xargs grep sed awk jq cat head tail wc sort uniq comm join paste cut tr)
進(jìn)程管理
(ps pstree kill pidof pgrep pkill nohup jobs bg fg disown fuser)
信息收集類
(lsof /proc netstat)
系統(tǒng)信息類
(lscpu lsblk lsscsi fdisk hostname uname dmesg ifconfig ethtool)
資源監(jiān)控類
(top free vmstat iostat sar iftop dstat nmon glances bpytop)
診斷類
(strace tcpdump gdb gprof pmap pstack gcore perf systemtap bcc bpftrace)
網(wǎng)絡(luò)工具類
(ncat socat ping telnet host nslookup traceroute mtr ngrep tshark tcpdump nmap whois)
注:網(wǎng)絡(luò)類命令在這篇文章里面有過(guò)系統(tǒng)介紹,感興趣可前往查看常用網(wǎng)絡(luò)命令總結(jié)
開(kāi)發(fā)輔助類
(curl wget mysql screen tmux ssh scp sshpass expect nano vim emacs)
用戶管理類
(su sudo w who whoami id)
8.常用基礎(chǔ)命令
輸出
# 輸出hello,并且尾部輸出一個(gè)換行符 $ echo hello hello # 輸出hello,尾部無(wú)換行符 $ echo -n hello # -e使用echo可以解釋\n\t這樣的轉(zhuǎn)義符 $ echo -e 'a\nb\tc' a b c # 效果類似-e,不過(guò)用的是bash的語(yǔ)法特性 $ echo $'a\nb\tc' a b c # 格式化輸出,類似C語(yǔ)言的printf函數(shù) $ printf "id:%d,name:%s\n" 1001 zhangsan id:1001,name:zhangsan # 參數(shù)多于占位符時(shí),printf會(huì)重復(fù) $ printf "id:%d,name:%s\n" 1001 zhangsan 1002 lisi 1003 wangwu id:1001,name:zhangsan id:1002,name:lisi id:1003,name:wangwu
目錄操作
# 切換到/home目錄 $ cd /home # 切換到當(dāng)前用戶家目錄 $ cd # ~也代表家目錄 $ cd ~ # 切換到上次的目錄 $ cd - # 顯示當(dāng)前目錄 $ pwd # 列出目錄下的文件或目錄 $ ls # 列出當(dāng)前目錄與一層子目錄,用了shell的*號(hào)擴(kuò)展功能 $ ls * # 列出文件或目錄,并顯示詳細(xì)信息,ll命令與其等價(jià) $ ls -l # 列出文件或目錄,時(shí)間倒序 $ ls -lt # 列出文件或目錄,大小倒序 $ ls -lS # 樹(shù)形顯示目錄與子目錄中的文件 $ tree # 只顯示2層目錄結(jié)構(gòu),-L 2表示遞歸深度為2 $ tree -L 2 # 顯示目錄以及子目錄的大小 $ du -h # 顯示當(dāng)前目錄的大小 $ du -h -s # -d1表示遞歸深度為1,即顯示當(dāng)前目錄下的目錄或文件大小 $ du -h -a -d1 # 當(dāng)前目錄下,創(chuàng)建temp目錄 $ mkdir temp # 創(chuàng)建多級(jí)目錄 $ mkdir -p temp/test/work # 當(dāng)前目錄下,刪除temp目錄,需保證待刪目錄是空的 $ rmdir temp # 重命名目錄,也可以重命名文件 $ mv temp temp_bak # 移動(dòng)目錄,也可以移動(dòng)文件 $ mv temp /tmp/temp_bak
文件操作
# 創(chuàng)建文件,touch實(shí)際是用來(lái)更新文件訪問(wèn)時(shí)間的,不過(guò)如果文件不存在會(huì)默認(rèn)創(chuàng)建它 $ touch temp.txt # 寫入hello,會(huì)覆蓋原來(lái)內(nèi)容 $ echo hello > temp.txt # 追加寫入hello $ echo hello >> temp.txt # 查看文件內(nèi)容 $ cat temp.txt # 清空文件內(nèi)容 $ echo -n > temp.txt # 復(fù)制文件 $ cp temp.txt temp_bak.txt # 刪除文件 $ rm temp_bak.txt # 查看文件類型 $ file temp.txt temp.txt: ASCII text # 查看文件屬性,大小/日期等 $ stat temp.txt File: temp.txt Size: 6 Blocks: 8 IO Block: 4096 regular file Device: 810h/2064d Inode: 186702 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ work) Gid: ( 1000/ work) Access: 2021-10-10 15:24:11.256764900 +0800 Modify: 2021-10-10 15:24:09.326764900 +0800 Change: 2021-10-10 15:24:09.326764900 +0800 Birth: - # 只獲取文件大小 $ stat -c %s temp.txt 6 # 獲取路徑上最后一級(jí)目錄或文件名 $ basename demo/temp.txt temp.txt # 獲取目錄名 $ dirname demo/temp.txt demo # 獲取全路徑名稱 $ realpath demo/temp.txt /home/work/demo/temp.txt # 獲取軟鏈接指向的文件 $ readlink /bin usr/bin # 修改文件所有者與讀寫權(quán)限 $ chown -R work:work test/ $ chmod -R 775 test/ # 查看文件系統(tǒng)空間使用情況 $ df -h #將本地/home/work/目錄下的文件上傳到遠(yuǎn)程/home/work/目錄里 $ scp -r /home/work/* work@10.76.2.83:/home/work/ #將遠(yuǎn)程/home/work/目錄下的文件下載到本地/home/work/目錄里 $ scp -r work@10.76.2.83:/home/work/* /home/work/
文件打包與壓縮
#壓縮文件為*.tar.gz(f必須在最后面) $ tar -cvzf files.tar.gz files/ #這兩個(gè)命令與上面等價(jià) $ tar -cvf files.tar files/ $ gzip files.tar #查看壓縮文件 $ tar -tvzf files.tar.gz #解壓tar.gz文件到/opt/目錄 $ tar -xvzf file.tar.gz -C /opt/ #解壓zip、Jar文件 $ unzip arthas-bin.zip -d arthas-bin/ $ unzip -O cp936 file.zip #解壓rar文件 $ rar x file.rar
進(jìn)程管理
# 列出所有進(jìn)程,BSD格式 $ ps aux # 列出所有進(jìn)程,Linux格式 $ ps -ef # 列出java進(jìn)程 $ ps -fC java # 查看進(jìn)程號(hào)為523的進(jìn)程 $ ps -fp 523 # 查看進(jìn)程樹(shù) $ pstree -Tp # 查看當(dāng)前shell的進(jìn)程樹(shù),其中$$會(huì)被shell解釋為當(dāng)前shell的進(jìn)程號(hào) $ pstree -Tp -s $$ init(1)───init(104)───init(105)───wsltermd(106)───bash(107)───bash(121)───pstree(7203) # 殺死523號(hào)進(jìn)程 $ kill 523 # 強(qiáng)制殺死523號(hào)進(jìn)程,如果你確定強(qiáng)殺也沒(méi)關(guān)系的話 $ kill -9 523 # 列出所有java進(jìn)程的進(jìn)程號(hào),類似命令還有pidof $ pgrep java # 殺死所有java進(jìn)程 $ pkill java
其它
# seq可以輸出連續(xù)數(shù)字 $ seq 4 1 2 3 4 $ seq 3 5 3 4 5 # yes會(huì)不斷輸出y,本是用來(lái)自動(dòng)確認(rèn)交互腳本的,但其也可指定輸出字串 $ yes hello | head -n4 hello hello hello hello # 顯示當(dāng)前時(shí)間串 $ date +'%FT%T%z' 2021-10-10T16:31:50+0800 # 顯示當(dāng)前時(shí)間綴 $ date +%s 1633854633 # 時(shí)間串與時(shí)間綴互轉(zhuǎn) $ date -d '2021-10-10T16:31:50+0800' +%s 1633854710 $ date -d '@1633854710' +'%FT%T%z' 2021-10-10T16:31:50+0800 # time用來(lái)測(cè)量命令執(zhí)行時(shí)間,sleep用來(lái)睡眠指定時(shí)間,默認(rèn)秒 $ time sleep 5 real 0m5.010s user 0m0.001s sys 0m0.000s # tee用于同時(shí)寫數(shù)據(jù)到文件和標(biāo)準(zhǔn)輸出 $ seq 5 | tee temp.txt 1 2 3 # 同時(shí)tee也可以用于觀察流過(guò)管道的數(shù)據(jù),只需要寫到/dev/tty即可,而bc是一個(gè)命令行版的科學(xué)計(jì)算器 $ seq -s+ 4 | tee /dev/tty | bc 1+2+3+4 10 # 將windows的換行符\r\n替換為\n $ dos2unix temp.txt # 將文件編碼從GBK轉(zhuǎn)到UTF-8 $ iconv -f GBK -t UTF-8 temp.txt > temp_utf8.txt # watch用于不斷觀察命令輸出結(jié)果,如下觀察日志的寫入情況 $ watch -d -n1 ls -lt logs/ # split用于文件拆分,比如按10M大小拆分日志文件,拆分后文件名類似app0001 $ split -b 10m app.log -d -a4 app # type用于查看命令安裝位置,which命令也可以,不過(guò)更推薦使用type $ type ps ps is hashed (/usr/bin/ps)
9.如何學(xué)習(xí)Linux命令
# 命令內(nèi)置的help,一般記錄了各命令選項(xiàng)的作用 $ awk --help # man與info記錄了命令的詳細(xì)說(shuō)明 $ man awk $ info awk # tldr記錄了命令常見(jiàn)用法 $ tldr awk # cht.sh綜合了tldr與man的能力 $ curl cht.sh/awk/:learn |less -R # coreutils軟件包含有日常使用的絕大多數(shù)常用命令,值得了解下 $ info coreutils
更美觀的Linux命令
如果你喜歡折騰,就把下面鏈接中的全部裝上吧!
https://github.com/ibraheemdev/modern-unix
知識(shí)延伸指引:
標(biāo)準(zhǔn)輸入沒(méi)有重定向時(shí),指向/dev/pts/1,它是啥東西?
到此這篇關(guān)于Linux命令基礎(chǔ)使用的文章就介紹到這了,更多相關(guān)Linux命令使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了Linux命令基礎(chǔ)使用,主要講解Linux命令基本使用,并帶認(rèn)識(shí)一些最基礎(chǔ)的Linux命令使用。具有一定的參考價(jià)值,需要的小伙伴可以參考一下,洗碗給對(duì)你有所2021-12-15
- Linux下的如何快速安裝Hadoop?今天小編就為大家?guī)?lái)了詳細(xì)的安裝教程,本教程也可以作為參考,配置是相似的,就是Linux命令、具體操作有所不同,需要的朋友一起看看吧2021-09-01
- 今天小編將為大家分享的是紅旗Linux上配置FTP 允許root用戶登錄;希望對(duì)大家會(huì)有幫助,有需要的朋友一起去看看吧2017-03-14
Linux系統(tǒng)能使用網(wǎng)銀嗎?Linux網(wǎng)銀使用方法介紹
Linux系統(tǒng)能使用網(wǎng)銀嗎?當(dāng)然可以哦,下面小編就為大家介紹Linux網(wǎng)銀使用方法,不會(huì)的朋友可以參考本文,希望能對(duì)大家有所幫助2016-08-18如何在紅旗Linux系統(tǒng)redflag6.0上安裝QQ
許多Linux用戶也想在自己的電腦上安裝QQ卻不知道該怎么在自己的電腦安裝QQ,下面為大家介紹下如何在紅旗Linux系統(tǒng)redflag6.0上安裝QQ,感興趣的朋友可以看看2015-04-21更改紅旗Linux6.0sp1系統(tǒng)分辨率讓看起來(lái)更舒服
分辨率可以讓我們?cè)谑褂秒娔X時(shí),看起來(lái)更加舒服,在紅旗6.0sp1中,許多用戶都不知道該如何修改屏幕的分辨率,下面是具體的更改方法,感興趣的朋友可以看看2015-04-20紅旗linux系統(tǒng)怎么樣? 安裝紅旗linux后應(yīng)該做什么?
安裝紅旗linux后應(yīng)該做什么?對(duì)于安裝好之后的紅旗linux如何配置網(wǎng)卡和時(shí)間,以及自定義桌面等最基本的配置本經(jīng)驗(yàn)。下面我們一起來(lái)看看怎么設(shè)置紅旗linux2015-04-03- 這篇文章主要介紹了紅旗Linux7.0桌面版系統(tǒng)安裝圖文教程,本文用詳細(xì)的圖文說(shuō)明講解了紅旗Linux7.0桌面版的安裝過(guò)程,需要的朋友可以參考下2015-03-12
- 請(qǐng)選擇最近的鏈接下載:(復(fù)制以下鏈接用迅雷等下載工具進(jìn)行下載!?。。? ftp://www.linux-ren.org/pub/redflag/dt7/olympic7.iso ftp://60.28.182.152/pub/redflag/d2008-09-08
紅旗系統(tǒng)redflag6.0上 安裝QQ的最簡(jiǎn)單方法
首先下載QQ for Linux tar.gz包(http://im.qq.com/qq/linux/download.shtml)。在第一個(gè)分區(qū)的root文件夾下新建一文件夾如:myqq,把剛下載的tar.gz版的QQ放在myqq下。然2008-09-08