UNIX實(shí)用命令

2018-11-24 15:25 更新

less

less 命令用來(lái)在控制臺(tái)中分屏顯示文本文檔。它在許多發(fā)行版中可用。

# less unixtoolbox.xhtml

一些重要指令(^N 代表 [control]-[N]):

  • h H       顯示指令的匯總列表

  • f ^F ^V SPACE       向前滾動(dòng)一屏(或者 N 行)

  • b ^B ESC-v       向后滾動(dòng)一屏(或者 N 行)

  • F       向前滾動(dòng);類似于"tail -f"

  • /pattern       向前搜索匹配該模式的行

  • ?pattern       向后搜索匹配該模式的行

  • n       重復(fù)之前的搜索

  • N       反方向重復(fù)之前的搜索

  • q       退出

vi

Vi 在任何 Linux/Unix 發(fā)行安裝版(gentoo 沒有?)上都存在。因此,我們有必要了解一些基本的命令。Vi 有兩個(gè)模式:命令模式和插入模式。使用 [ESC] 鍵可進(jìn)入命令模式,使用 i 鍵可進(jìn)入插入模式。如果你迷失了,可在命令模式下鍵入 : help
編輯器 nano 和 pico 通常也都可用,而且更容易(IMHO)使用。

Quit

  • :w newfilename       保存文件為 newfilename

  • :wq or :x       保存并退出

  • :q!       退出但不保存

移動(dòng)和查找

  • /string       向前查找 string

  • ?string       向后查找 string

  • n       同方向重復(fù)上一次搜索命令

  • N       反方向重復(fù)上一次搜索命令

  • {       光標(biāo)移至段落結(jié)尾

  • }       光標(biāo)移至段落開頭

  • 1G       光標(biāo)移至文件的第一行首

  • nG       光標(biāo)移至文件的第 n 行首

  • G       光標(biāo)移至文件的最后一行首

  • :%s/OLD/NEW/g       替換所有查找到的 OLD 為 NEW

刪除文本

  • dd       刪除當(dāng)前行

  • D       刪除光標(biāo)到當(dāng)前行末尾的字符

  • dw       刪除單詞

  • x       刪除字符

  • u       回復(fù)上一次操作

  • U       回復(fù)所有此行的更改

mail

mail 命令是一個(gè)讀取和發(fā)送郵件的應(yīng)用程序,她通常已安裝。要發(fā)送一封郵件,可以簡(jiǎn)單的輸入 "mail user@domain"。其第一行為主題,然后是郵件內(nèi)容。在一個(gè)新行中使用單個(gè)點(diǎn)(.)來(lái)結(jié)束并發(fā)送郵件。例子:

# mail c@cb.vu
Subject: Your text is full of typos
"For a moment, nothing happened. Then, after a second or so, 
nothing continued to happen."
.
EOT
#

這同樣可用于管道:

# echo "This is the mail body" | mail c@cb.vu

也是測(cè)試郵件服務(wù)器的簡(jiǎn)單方法。

tar

命令 tar (磁帶存檔) 可以為文件和目錄創(chuàng)建檔案。歸檔文件 .tar 是未壓縮的,一個(gè)壓縮過的歸檔文件的后綴是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用絕對(duì)路徑建立一個(gè)歸檔文件,你可能要解開這個(gè)歸檔文件到某個(gè)地方。一些常用命令如下:

創(chuàng)建

# cd /
# tar -cf home.tar home/        # 歸檔整個(gè) /home 目錄(c 為創(chuàng)建)
# tar -czf home.tgz home/       # 等同于 zip 壓縮
# tar -cjf home.tbz home/       # 等同于 bzip2 壓縮

從一個(gè)目錄樹中只包含一個(gè)(或2個(gè))目錄,并保持相對(duì)目錄結(jié)構(gòu)。舉個(gè)例子,/usr/local/etc 和 /usr/local/www,它們?cè)跉w檔文件中的第一層目錄是 local/。

# tar -C /usr -czf local.tgz local/etc local/www
# tar -C /usr -xzf local.tgz    # 釋放 local 目錄到 /usr
# cd /usr; tar -xzf local.tgz   # 同上面一樣

釋放(Extract)

# tar -tzf home.tgz             # 列出歸檔文件中的所有文件,并不釋放
# tar -xf home.tar              # 釋放歸檔文件(x 為釋放)
# tar -xzf home.tgz             # 等同于 zip 壓縮
# tar -xjf home.tgz             # 等同于 bzip2 壓縮
# tar -xjf home.tgz home/colin/file.txt    # 釋放單個(gè)文件

更高級(jí)的

# tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # 歸檔壓縮 dir/ 目錄并存儲(chǔ)到遠(yuǎn)程主機(jī)上
# tar cvf - `find . -print` > backup.tar              # 歸檔當(dāng)前目錄
# tar -cf - -C /etc . | tar xpf - -C /backup/etc      # 拷貝目錄
# tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc      # 遠(yuǎn)程拷貝
# tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/

dd

程序 dd (磁盤備份(disk dump) 或 destroy disk,也可看 dd 的含義) 用來(lái)拷貝分區(qū)、磁盤或者其它拷貝。通常這么用:

# dd if=<source> of=<target> bs=<byte size> conv=<conversion>

重要的 conv 選項(xiàng):

  • notrunc       不截短輸出文件

  • noerror       出錯(cuò)時(shí)不停止處理(e.g. 壞扇區(qū))

  • sync       把每個(gè)輸入塊填充到ibs個(gè)字節(jié),不足部分用空(NUL)字符補(bǔ)齊

默認(rèn)字節(jié)大小為 512 (一個(gè)扇區(qū))。MBR 處于磁盤的第一個(gè)扇區(qū),之后的 63 個(gè)扇區(qū)是空的。較大的字節(jié)大小可以加快拷貝速度但也需要更多的內(nèi)存。

備份和恢復(fù)

# dd if=/dev/hda of=/dev/hdc bs=16065b                # 拷貝磁盤到磁盤(相同大小)
# dd if=/dev/sda7 of /home/root.img bs=4096 conv=notrunc,noerror # 備份 /
# dd if /home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # 恢復(fù) /
# dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz                  # 壓縮備份
# gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M                 # 解壓恢復(fù)
# dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # 也可為遠(yuǎn)程的
# gunzip -dc ad4s3e.gz | ssh eedcoba@host 'dd of=/dev/ad0s3e bs=1M'
# dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror    # 忽略 MBR
# 如果目標(biāo)(ad2)比較小,這是必須的。

恢復(fù)

該 dd 命令會(huì)讀取分區(qū)的每一個(gè)區(qū)塊,即所有區(qū)塊。對(duì)于有問題的區(qū)塊,最好使用 conv=sync,noerror 選項(xiàng),dd 將會(huì)跳過壞的區(qū)塊并入 0。因此,這就是設(shè)置塊大小等于或小于磁盤塊大小的重要性。1k 大小似乎安全,用 bs=1k 來(lái)設(shè)置它。假如一個(gè)磁盤有壞扇區(qū)并且有個(gè)分區(qū)的數(shù)據(jù)要恢復(fù),那么用 dd 工具創(chuàng)建一個(gè)鏡像文件,掛載這個(gè)鏡像文件,然后拷貝內(nèi)容到新的磁盤中。如果用了 noerror 選項(xiàng),dd 會(huì)跳過壞扇區(qū)并寫入 0,也即壞扇區(qū)中的內(nèi)容會(huì)丟失。

# dd if=/dev/hda of=/dev/null bs=1m                   # 檢查壞扇區(qū)
# dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # 發(fā)送到遠(yuǎn)程
root@fry 'dd of=hda1.gz bs=1k'
# dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img    # 存儲(chǔ)為一個(gè)映像文件
# mount -o loop /hda1.img /mnt                        # 掛載這個(gè)映像文件
# rsync -ax /mnt/ /newdisk/                           # 拷貝到一個(gè)新磁盤
# dd if=/dev/hda of=/dev/hda                          # 刷新磁狀態(tài)
  # 上面的命令對(duì)于刷新磁盤(refresh disk)很有用。這絕對(duì)安全,但必須先卸載磁盤。

### 刪除
# dd if=/dev/zero of=/dev/hdc                         # 刪除全部數(shù)據(jù)
# dd if=/dev/urandom of=/dev/hdc                      # 更好的刪除全部數(shù)據(jù)
# kill -USR1 PID                                      # 查看 dd 進(jìn)度(僅Linux!)

MBR 技巧

MBR 包含了引導(dǎo)程序和分區(qū)表,它的大小為 512 字節(jié)。前 446 字節(jié)為引導(dǎo)程序,446 到 512 字節(jié)為分區(qū)表。

# dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1                  # 完全備份 
MBR# dd if=/dev/zero of=/dev/sda bs=512 count=1                  # 刪除 MBR 和分區(qū)表
# dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1                  # 完全恢復(fù)MBR
# dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1                  # 僅回復(fù)引導(dǎo)程序
# dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # 恢復(fù)分區(qū)表

screen

Screen 提供了兩個(gè)主要功能:

  • 在一個(gè)終端內(nèi)運(yùn)行多個(gè)終端會(huì)話(terminal session)。

  • 一個(gè)已啟動(dòng)的程序與運(yùn)行它的真實(shí)終端分離的,因此可運(yùn)行于后臺(tái)。真實(shí)的終端可以被關(guān)閉,還可以在稍后再重新接上(reattached)。

簡(jiǎn)短實(shí)例

開啟 screen: # screen

在 screen 會(huì)話中,我們可以開啟一個(gè)長(zhǎng)時(shí)間運(yùn)行的程序(如 top)。Detach 這個(gè)終端,之后可以從其他機(jī)器 reattach 這個(gè)相同的終端(比如通過 ssh)。 # top

現(xiàn)在用 Ctrl-a Ctrl-d 來(lái) detach。Reattach 終端: # screen -r

或更好的:

# screen -R -D

現(xiàn)在 attach 到這里。具體意思是:先試圖恢復(fù)離線的 screen 會(huì)話。若找不到離線的 screen 會(huì)話,即建立新的 screen 會(huì)話給用戶。

Screen 命令 (在 screen 中)

所有命令都以 Ctrl-a 開始。

  • Ctrl-a ? 各功能的幫助摘要

  • Ctrl-a c 創(chuàng)建一個(gè)新的 window (終端)

  • Ctrl-a Ctrl-n 和 Ctrl-a Ctrl-p 切換到下一個(gè)或前一個(gè) window

  • Ctrl-a Ctrl-N N 為 0 到 9 的數(shù)字,用來(lái)切換到相對(duì)應(yīng)的 window

  • Ctrl-a " 獲取所有正在運(yùn)行的 window 的可導(dǎo)航的列表

  • Ctrl-a a 清楚錯(cuò)誤的 Ctrl-a

  • Ctrl-a Ctrl-d 斷開所有會(huì)話,會(huì)話中所有任務(wù)運(yùn)行于后臺(tái)

  • Ctrl-a x 用密碼鎖柱 screen 終端

當(dāng)程序內(nèi)部運(yùn)行終端關(guān)閉并且你登出該終端時(shí),該 screen 會(huì)話就會(huì)被終止。

Find

一些重要選項(xiàng):

  • -x (BSD) -xdev (Linux)       留于同一文件系統(tǒng) (fstab 中的 dev)

  • -exec cmd {} \;       執(zhí)行命令并用全路徑替換 {}

  • -iname       同 -name 一樣,但不區(qū)分大小寫

  • -ls       顯示關(guān)于文件的信息(同 ls -la)

  • -size n       n 為 +-n (k M G T P)

  • -cmin n       查找系統(tǒng)中最后 n 分鐘改變文件狀態(tài)的文件
# find . -type f ! -perm -444        # 尋找所有無(wú)法讀取的文件
# find . -type d ! -perm -111        # 尋找所有無(wú)法訪問的目錄
# find /home/user/ -cmin 10 -print   # 尋找最后 10 分鐘創(chuàng)建或修改的文件
# find . -name '*.[ch]' | xargs grep -E 'expr' # 在當(dāng)前目錄及子目錄搜索 'expr' 表達(dá)式
# find / -name "*.core" | xargs rm   # 尋找 core 垃圾并刪除它們(也可試試 core.*)
# find / -name "*.core" -print -exec rm {} \;  # 另一種語(yǔ)法
      # 尋找圖像文件并創(chuàng)建一個(gè)歸檔文件,iname 為不區(qū)分大小寫。-r 為附加
      # find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \;      
# find . -type f -name "*.txt" ! -name README.txt -print  # 除 README.txt 的文件
# find /var/ -size +10M -exec ls -lh {} \;     # 查找 > 10 MB 的文件
# find /var/ -size +10M -ls           # 這個(gè)更簡(jiǎn)單
# find . -size +10M -size -50M -print
# find /usr/ports/ -name work -type d -print -exec rm -rf {} \;  # 清理 port
      # 以 SUID 查找文件;這些文件很脆弱,必須保持安全。
# find / -type f -user root -perm -4000 -exec ls -l {} \;

小心 xarg 或 exec,因?yàn)楫?dāng)文件或目錄中包含空格時(shí)可能會(huì)返回錯(cuò)誤的結(jié)果。在有疑惑時(shí)用 "-print0 | xargs -0" 代替 "| xargs"。選項(xiàng) -print0 必須在 find 命令的最后??催@個(gè)不錯(cuò)的[find 迷你教程](http://www.hccfl.edu/pollock/Unix/FindCmd.htm).    # find . -type f | xargs ls -l       # 不能工作于有空格的名字
# find . -type f -print0 | xargs -0 ls -l  # 可工作于有空格的名字
# find . -type f -exec ls -l '{}' \; # 或使用用于 -exec 的引用 '{}'

混雜的

# which command                      # 顯示命令的全路徑名
# time command                       # 顯示一個(gè)命令執(zhí)行完成所用的時(shí)間
# time cat                           # 使用 time 作為秒表,用 Ctrl-c 來(lái)停止
# set | grep $USER                   # 列顯當(dāng)前環(huán)境變量
# cal -3                             # 顯示三個(gè)月日歷
# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
# date 10022155                      # 設(shè)置日期和時(shí)間
# whatis grep                        # 顯示命令的簡(jiǎn)短信息
# whereis java                       # 查詢命令的的路徑和標(biāo)準(zhǔn)目錄
# setenv varname value               # 設(shè)置環(huán)境變量,設(shè)置變量 varname 的值為 value (csh/tcsh)
# export varname="value"             # 設(shè)置環(huán)境變量,設(shè)置變量 varname 的值為 value  (sh/ksh/bash)
# pwd                                # 顯示當(dāng)前工作目錄# mkdir -p /path/to/dir              
# 如果存在不顯示錯(cuò)誤,建立所需的上級(jí)目錄# mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs}
# rmdir /path/to/dir                 # 移除目錄
# rm -rf /path/to/dir                # 移除目錄和其內(nèi)容(強(qiáng)制)
# cp -la /dir1 /dir2                 # 存檔、硬連接目錄所有文件,用來(lái)替代拷貝
# cp -lpR /dir1 /dir2                # 同上 (FreeBSD)
# cp unixtoolbox.xhtml{,.bak}        # 拷貝文件成新擴(kuò)展名的快速方法
# mv /dir1 /dir2                     # 修改目錄名
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)