虛擬機以及安裝linux系統
安裝新的virtualBox
1. VB ---> new aaa--->...new disk...--->finish
2. open aaa--->choose ubuntu-12.04-desktop-i386.iso --> ...click icon of install unbuntu --> about 30m, it'll restart --> 右下角圖標,點擊移除iso磁碟
3. install guest addtional in ubuntu menu // 共享,粘貼等重要功能
安裝失敗:sudo apt-get install build-essential // 安裝一堆開發工具gcc,make等
4. 打開命令行: ctrl + alt + t
使window與virtualBox互相粘貼:
可直接在設置中修改:設置--〉一般--〉進階
設置VB與window互訪:
設置--〉共用資料夾 全勾選後並不需要下面的操作
( mount -t vboxsf win_folder /mnt/windows // write this to /etc/rc.local )
訪問windows文件夾:ll /media/windowBag/
vdi文件的位置:設置--〉存放裝置
F:\A_myTOP\ubuntu_12.04.1_null.vdi
D:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso
vb擴容:用UUID或者vdi文件來設置
(1) D:\Program Files\Oracle\VirtualBox>VboxManage list hdds
VBoxManage modifyhd 96fe8d50-7b14-4acf-a2f6-fd63ba59debd --resize 20480
VBoxManage modifyhd E:\wiUCS_project\webRTC\dld_doc\ubuntu_12.0.4.vdi.vdi --resize 20480 // 單位MB,so 20G
(2)fdisk , mkfs, mount
原來的擴張分區,導致新的磁盤空間無法在fdisk中顯示 // 刪除擴展分區後,再加入新分區,就 OK了
fdisk /dev/sda; m == menu ; d == del; n = new; w==write;
加入分區後要重啓後,系統才認得。 mkfs -t ext3 /dev/sda2 ; mount /dev/sda2 /home/ding/extented_disk
安裝新的VMware
VMware 配置
v0 : bridge v1 : host-only v8 : NAT(多了DHCP,NAT server )
新建aaa--->打開aaa,裝入CentOS-6.3-x86_64-bin-DVD1.iso後,安裝mini--->install vmware tools(自帶,互相粘貼等功能)
1。需要修改網絡配置:改爲橋接後,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no
2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf
3. 控制檯沒有滾動條,用shift+pageUp翻頁
通過filezilla訪問linux
sudo apt-get install openssh-server // 在VB中安裝ssh/ftp server ,上傳失敗時以root登錄
sudo passwd root // 修改密碼
進入其它linux系統
sudo -s // 只有root用戶,是所有機器上都有的角色;切換到root用戶後,以root登陸ssh服務器
ssh other's IP // ssh user@ip
文件傳輸
安裝ssh server, 用sftp進行安全的文件傳輸。其實sftp就是ssh 的一個程式
sftp [email protected]
下載: sftp > get /remote/index.php /local/
上傳: sftp > put /local/Linuxgl.pdf /remote/fuyatao/
遠端的命令: pwd命令可以幫您查詢遠程主機的當前路徑。查詢本機當前工作目錄 lpwd. // 本機都加l=local
訪問ftp服務器
sudo ftp 10.5.90.10 //windows上的
name: anonymous
ftp > cd temp/Whiteboard/lynckia_bag
ftp > ls
ftp > get lynckia_jinwei.tar.gz newName_lynckia.tar.gz
安裝
在線安裝
ubuntu: apt-get install XXX XXX
更新源:備份後搜索源來更新此文件 /etc/apt/source.list ; 再執行 sudo apt-get update
centos: yum -y install XXX XXX
包安裝
ubuntu: dpkg -i XXX.deb
centos: rpm -ivh XXX.rpm // http://rpm.pbone.net/ ——這是一個給力的rpm包網站。
(-i==install, v=詳細信息,h=hash, -e=erase刪除,-U=升級)
安裝包的轉換rpm--->deb
apt-get install alien
alien --scripts *.rpm
檢查是否已經安裝
centos: rpm -qa |grep dhcp
ubuntu: dpkg --get-selections | grep office // 查找libreoffice是否卸載完成,否則用purge清除
apt-get purge libreoffice*
更新ubuntu
ubuntu--->system--->manager--->upgrade
mini版本安裝後用yum下載
1。需要修改網絡配置:改爲橋接後,/etc/sysconfig/network-script/ifcfg-eth0,另onboot=yes,MM_controlled=no
2. 修改DNS: echo "nameserver 8.8.8.8" > /etc/resolv.conf
3. yum -y update
4. yum search XXX; yum install -y XXXX
yum建立本地源後進行安裝:
Yum: Yellowdogy Updater Modified.軟件倉庫(repository)的源,可以是http,ftp站點,或者是本地的資源。
createrepo這個軟件可以解決軟件之間的依賴。
1. 在線下載nfs安裝包: 先修改配置文件vi /etc/yum.conf 另 keepcache =1
yum install nfs-utils.x86_64
2. 默認從網上下載的安裝文件存放在:/var/cache/yum,把之下的nfs相關的rpm包全部拷貝到/mnt/nfsSrc/x86_64
cp *.rpm /mnt/nfsSrc/x86_64
3. 創建軟件庫
createrepo /mnt/nfsSrc/
vi /etc/yum.repo.d/base.repo 另 baseurl=file:///mnt/nfsSrc/
4. 從本地源安裝
yum install nfs-utils.x86_64
配置安裝NFS
直接在本地包中安裝:cd /mnt/nfsSrc/ ; rpm -ivh *.rpm
服務器:
配置: cat /etc/exports
/mnt/nfsServer 10.50.141.0/24(ro,no_root_squash) // 把某目錄給這些地址共享(只讀,root權限)
啓動:/etc/init.d/rpcbind start
/etc/init.d/nfs start
檢查:showmount -a
客戶端:
檢查服務器是否可用: showmount -e 10.50.141.22
掛載到服務器: mount -t nfs 10.50.141.22:/mnt/nfsServer /mnt/nfsClient -o nolock
未做的:
yum install rpcbind(centos6)
將nfs加入開機啓動項chkconfig nfs on
安裝配置jdk
0. 查看已經安裝的版本: java -version
1. 安裝bin或者把得到的jdk包直接拷貝到某目錄
2. 設置環境變量: centos: vi /etc/profile ; source /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_45
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
3. 更新java版本
update-alternatives --install /usr/bin/java java /usr/java/jdk1.7.0/bin/java 60
update-alternatives --config java
4. 驗證: java
安裝eclipse
ubuntu_eclipse_install // install package
安裝jdk: sudo dpkg -i java-1.6.0-openjdk_1.6.0.0-2.7_i386.deb
安裝eclipse: eclipse-linuxtools-helios-SR1-incubation-linux-gtk.tar.gz
配置: sudo cp -r /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0/jre ./
linux環境變量
顯示變量: env; export; echo $WELCOME
設置新的: set env var; export WELCOME="hello";
設置只讀: readonly WELCOME // (unset WELCOME) can't clear or modify
僅當前shell(控制檯)有效: PATH=$PATH:/home/myplugin // linux用冒號分隔,window用分號
export:
1. 在控制檯中執行腳本時,控制檯是父shell, 腳本運行在子shell
2. 環境變量僅僅在當前shell中有效;當用export導出變量時,變量將在子shell中有效
so 當前和子shell(控制檯中執行的script)有效: 控制檯中執行 export PATH=$PATH:/home/temp
重啓後仍有效: 將export那句添加到配置文件
centos: /etc/profile // all user
/home/brian/.bashrc // only user brian
source /etc/porfile // 配置文件立即生效
將腳本的執行結果導入到當前的shell: . ./ding_exec.sh or . /var/psbl_env
/var/psbl_env 導出某變量,這個結果導入到當前shell(控制檯)。所以在控制檯中執行的CLI(子shell)能夠通過 getenv() 得到該變量
啓動
1. 圖形界面和字符界面的切換
alt+ctrl+F1-6 : 圖形->字符
alt+ctrl+F7 : 字符->圖形
2. 啓動時指定界面: 3:字符 5:圖形
vi /etc/inittab // 0:停止, 1:單用戶, 2:多用戶無NFS, 4:無用, 6:重啓
3. 重新啓動: alt+ctrl+Backspace
4. 當前運行級別時間: who -r
網絡
顯示以及臨時修改
ifconfig eth0:0 XXX netmask XXX [boardcast XXX] // 在eth0上增加另一個IP
ifconfig eth0:0 down // 刪除eth0:0
ifconfig eth0 XXX netmask XXX
route -n == netstat -rn
route add -net XXX netmask XXX gw XXX // route del -net...
route add default gw 192.168.1.1
hostname XXX
centos配置文件:
修改IP: /etc/sysconfig/network-scripts/ifcfg-eth0 //配置靜態的 BOOTPROTO=static
1.拷貝VMware後,需要修改mac地址(在VM設置中), service network restart/reboot(卸載virtualBox可能網卡被佔用)
2.增加一個網口,拷貝ifcfg-eth0後,修改重啓即可。
DNS域名修改: /etc/resolv.conf
修改HOSTNAME: /etc/sysconfig/network
ubuntu配置文件:
修改IP: /etc/network/interfaces // address 192.168.0.111...
重啓: sudo /etc/init.d/networking stop/start
下載分享
$ wget http://192.168.30.140/cgiPic/screen.bmp -O ./ttt.bmp // 其他類似工具axel, lftp
$ curl http://192.168.30.140/CGI/Screenshot -u dld:dld // 密碼
python -m SimpleHTTPServer 8080 // 在需要共享的文件夾下執行此命令。 通過http://ip:8080來訪問
sudo dhclient // client obtain ip via dhcp server
信號
# kill -l
4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 16) SIGSTKFLT 18) SIGCONT 19) SIGSTOP ......
信號0: // 退出shell。 ctrl+D
1) SIGHUP // 父進程結束,子進程收到。比如wget能捕獲SIGHUP信號,並忽略它,這樣就算退出了Linux登錄,wget也 能繼續下載。
2) SIGINT // 來自鍵盤的終止: ctrl+C
3) SIGQUIT // 從鍵盤退出: ctrl+\
9) SIGKILL // 無條件終止: kill -9 進程號
15) SIGTERM // 程序正常退出時的處理
17) SIGCHLD // 子進程結束時,父進程會收到
20) SIGTSTP // 暫停並掛起,在屏幕上顯示掛起的進程號: crtl+Z
進程
後臺運行
crtl+Z // 暫停並掛起,在屏幕上顯示掛起的進程號
bg num // 將暫停的程序放到後臺運行
jobs // 顯示後臺運行的程序
fg num // 將暫停的程序放回前臺運行
殺死
通過名字 sudo killall/pkill node
通過關鍵字殺掉多個相同的進程 PIS=`ps -efww | grep "$1" | grep -v "grep" | awk '{print $2}'`
echo ${PIS} | xargs kill
查詢
ps -ef|grep careStr // ps -aux
netstat -apn |grep :22 // t=tcp, n=num, p=program, l=listen, a=all
lsof -i :22 // 根據端口號,誰在用22端口
讓終端忽略掛斷信號nohup: no hangup
& // 讓命令在後臺運行;
>file 2>&1 // 輸出到某文件,否者輸出到nohup.out
nohup $DAEMON_SH $PROCESS_CVT > $CVT_HOME/log/cvt.log 2>&1 &
打印進程中的線程個數
ps max -o %mem, lstart,lwp,pid,nlwp,cmd // 打印進程的:開始時間,tID,pID, 線程的個數,命令名
# ps max -o pid,nlwp,cmd |grep 3067
3067 270 node erizoController.js // 驗證: ls /proc/3067/task 通過進程的pid可以得到線程的tid
線程:linux中每個進程的最大線程個數 = VIRT / 棧的大小
VIRT:virtual memory usage ; 棧大小用 ulimit -a查看
NTPL : linux中線程的實現的庫 # getconf GNU_LIBPTHREAD_VERSION
系統
df -[ikmh] // 查看硬盤使用容量 h = human
du -[acs bkm] 目錄 //查看檔案的容量
du -sh /share/dld/ // 查看某個目錄的大小
du --max-depth=1 -h ./ // 查看一級目錄的大小
top -b -n 1 // 查看CPU,內存
top裏顯示的所有的cpu加起來的使用率,你的機子是多核吧,你運行top後按大鍵盤1看看,可以顯示每個cpu的使用率,
從系統文件得到系統信息
pid: /proc/num
cmd: /proc/xxx/cmdline
task: /proc/xxx/task
status: /proc/xxx/status : short_cmd | state | ppid | time ...:
route: /proc/net/route
netstat: /proc/net/tcp
uid/gid: stat("/proc/xxx", &sb) getpwuid(uid)
重定向
0輸入 1輸出 2錯誤
ls >/dev/null 2>&1 // ls的標準輸出不顯示,標準錯誤同標準輸出一樣處理
cmd < file // file作爲cmd的輸入
cmd 2>> file // 把 stderr 重定向到 file 文件中(追加)
cmd 1>file // 把標準輸出重定向到文件。 1> 等同於 >, 0< == <
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward // 是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案
cmd < inputFile > outputFile //
cmd < &m // 把文件描述符m作爲標準輸入
常用命令
find . -type d -name "*.svn"|xargs rm -rf
find . -name "*.sh" -exec chmod +x {} \;
find . -ctime 1 // 一天內新增的目錄或檔案
find . -newer .bashrc // 比 .bashrc 還要新的檔案
find . -user test // 擁有者爲 test 的檔案
find | grep "mux" // 文件名含有mux的
find | xargs grep "mux" // 文件內容含有...
find | wc -l // 統計行數,即文件個數
tar zxvf xxx.tar.gz -C newDir // -C:在新目錄中解壓; -z zip; -x extract; -v verbose; -f archFile
tar zxmvf openssl-1.0.1e.tar.gz // 可以用 -m參數來把文件的時間(modify time)設置爲當前系統的時間
或者解壓後修改每個文件的時間 find . -exec touch -am '{}' \;
tar zcvf SMBIOS.tar.gz SMBIOS/ // 壓縮 : -c creat/compansion
tar jxvf FileName.tar.bz2 // 解壓bz2 : -j
tar jcvf FileName.tar.bz2 DirName
tar tvf xxx.tar.gz // 查看包裏的內容
檔案與目錄管理: ls, cp, rm, mv, basename, dirname,
rm -rf XXX // 刪除以及子目錄
ll -trh // t=time, r=reverse, h=human
ll | grep "^d" // 查看目錄,查看文件 grep "^-"
basename /etc/fstab // fstab
dirname /etc/fstab // /etc
mkdir -p XXXdir; touch XXXfile // 創建目錄(-p 存在不創建)以及文件
檔案與目錄權限: chown, chmod, umask, chattr, lsattr,
chmod -R 777 XXX // -R: 子目錄也
r=4, w=2, x=1; Usr/Group/Other/All ; // 對於目錄, r=列出文件, w=增刪文件, x=進入目錄
ls -l /usr/bin/passwd -rwsr-xr-x // 以lidanding用戶進入linux, 在執行時具有root權限 ; 若無x屬性,則爲大S
suid = 4, guid = 2; Set UID ( SUID ) 的主要功能是在『某個檔案執行的期間具有檔案擁有者的權限』
具有 sticky bit 屬性的該”目錄”下的檔案,其檔案或目錄只有檔案擁有者及 root 纔有權力刪除!
755 + sticky bit = chmod 1755 file // sticky == 1
文件屬性:只能添加,不可修改。。。 +i // 文件不可改變
lsattr ../showCmd.c // ------------- ../showCmd.c
sudo chattr +i ../showCmd.c
lsattr ../showCmd.c // ----i-------- ../showCmd.c
sudo rm -rf ../showCmd.c // rm: cannot remove `../showCmd.c': Operation not permitted
文件中字符替換
替換一個文件: cat file|sed 's/old/new/g' > file2
批量替換: sed -i "s/oldString/newString/g" `grep oldString -rl /path`
grep oldString -rl /path | xargs sed -i "s/oldString/newString/g"
window,linux文件轉換(win: /r/n == unix: /n, so need to del /r )
回車(return to head)== \r == ^M ==CR == 0D
換行(new line) == \n == ^J ==LF == 0A
在linux上檢查window文件是否非法:
cat -v filename // cat -A winFile
:set ff=unix // 用vi來查看
文件轉換win--->unix
dos2unix winFile unixFile
:%s/^m//g // 用vi來刪除
文件查看: cat, tac, more, less, head, tail, nl, od,
wc -l file // -l 行數 -w 字數 -c 字符
cut -b5-9 file // 輸出文件的5-9行
echo "a b c" | cut -d' ' -f 2 // -d 分隔符 -f 第幾個域 結果:bc
cat >> log.txt << ding // 在log.txt中通過命令行輸入,以ding結束,否則以ctrl+D結束
less xxx.c // 可上下翻頁,可/Half 按 n 查找
nl xxx.c // == cat -n 顯示行號
sudo od core-CLI-759-1331002286 // 查看二進制文件
查找文件或目錄: which, whereis, locate, find,
locate dld // 記錄在數據庫文件中,所以先要同步 $ sudo updatedb
whereis -b ls // 也是數據庫,只找到執行檔?
which ls // 根據 PATH, 只找執行檔
# lsb_release -a // 查看是什麼linux系統以及版本 == cat /etc/issue
# uname -a // 查看處理器,硬件平臺等
# file /bin/ls // 查看文件屬性,文件類型
type -a pwd // 查看命令類型,是否是shell builtin
# getconf LONG_BIT // 查看系統的位數
cd /media/XXX // enter linux CD
多命令處理
find -type f | xargs dos2unix // 批量轉換
tar lastfile.tar.gz `find . -mtime 1 -type f -print` // 將 `命令執行的結果` 當做參數
ls -l && pwd // first is ok, then exec second
cp 1.txt 2.txt || echo "fail to cp 1 to 2" // first is fail, then second
文字文本處理
正則表達式
// js中運用:用戶名只能: 字母 數字 _ ()
var usern = /^[a-zA-Z0-9_\(\)]{1,}$/;
!username.match(usern)
^...$ // ^開頭 $結尾 . 點爲任意字符數字 ^$ 空行
[Aa]\{2, 4\} // A或a 出現2到4次
[^0-9\$] // ^在這裏表示非,非數字或美元標識,
[Dd|ld]\. // Dld. dld.
以一個句點和兩個數字開始 ^\.[0-9][0-9]
至少一個小寫字母 [a-z][a-z]*
日期格式d d - m m - y y y y [0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}
以t h e開頭行 ^[the]
包含m a y大寫或小寫字母的行 [mayMAY]
匹配任意行 [^.*$]
sed :以行爲單位,處理字串的增,刪,改
sed [-nefr] [動作] 文件 // 動作:del, read, write, quit, print,
TLINE=`sed -n '/^exit 0$/=' $0` // =行數 `反引號` $0這個表示腳本文件
sed "1,${TLINE}d" $0 >"${TMP_PATH}/wiucs.tar.gz" // d刪除
sed -n '1,$p' a.txt // 打印1到最後一行;$表示最後一行
sed -n -e '/\$/'p -e '/\$/=' a.txt // 打印最後一行,以及它的行號; =表示行數;-e 多個條件
sed -i "s|\.\./wiucs-cvt|/opt/wiucs-cvt|" webmCvtServer.js
awk :以行爲一次處理單位,以字段爲處理單元,適用於數據庫表
awk '條件類型1{動作1} 條件類型2{動作2}' filename
awk '{print $0}' data.txt // 打印 $0 == 所有域,$2 == 第二列
awk '{if($1~/34/) print $0}' data.txt // ' { if() print } '
awk '$2 == "dld" {print $0}' data.txt // ' == {print} '
awk 'END {print NR}' data.txt // NR == 行個數 NF == 域個數
awk -F/ '{print $NF}' // 當前目錄名字,-F 設置域分隔符
grep :以行爲單位,提取行中的字符串
grep [-acinv] '搜尋字符串' filename
grep -c "48" data.txt // count: data.txt中有幾行包含48
grep -n "48" data.txt // num: 打印出行號以及行
grep -v "48" data.txt // 打印出不包含的行
grep -E '1|73' data.txt //擴展模式,正則表達式 查找含有1或者73的行
ll |grep '^d' // 僅僅查詢目錄, grep '^[^d]' 查詢非目錄
grep -r sys_getenv * // grep 根據文件的內容查找
shell
shell函數
NAME="aa bb"
functionA(){ //
echo $1 // 這裏的$1是函數的參數
echo $2 // 這裏的$2是函數的參數
}
functionA $NAME $1 // 這裏的$1的是腳本的參數,結果: aa \n bb
functionA "$NAME" $1 // 加引號後作爲整體傳入參數,結果: aa bb \n cc
./funcA cc : 結果如上
shell腳本做成命令
chmod +x xxx.js
sh xxx.js stop // 執行腳本
cd /usr/bin ; ln -s xxx.sh wiucs // 軟鏈接成命令
wicus stop // 執行命令
語法
num=2
echo "this is ${num}nd" // 結果:# this is 2nd,要帶括號,否則不認得numnd
echo '$SHELL' = echo \$SHELL // 輸出爲 $SHELL,
echo "$AA" == echo $AA // 輸出爲AA的值
[ -x "file" ] || { echo "can't be exe"; exit 1; } // -n 非空串 -z 空串 -x可執行 -f 文件
[ "$var" = "$var2" ] [ $# -lt 3 ] // 等於,
if ...; then // 用分號代表括號,簡寫elif,倒序esac, 結束done,列舉in
位置變量 :
$? 檢查腳本返回的狀態;
$0 腳本的名字;
$1 第一個參數;
$* 所有的參數
$# 參數的個數;
$$ processID
常用
USER='id -u' // 用戶的id, root == 0. `這個不是單引號,是左上角的那個反引號`
read -p "yes or no?" ANSWER // echo $ANSSER
磁盤管理: 分區 fdisk --> 格式化 mke2fs --> 掛載 mount
fdisk -l // 直接查看分區情況
fdisk 磁盤 // enter
m // 幫助 manual
p // 查看 print
系統最多支持4個主分區,爲解決分區不夠的問題,又產生了擴展分區(extended)的概念。
這樣,系統最多可以有3個主分區,一個擴展分區。在擴展分區中,又可以再分爲多個邏輯分區,能從5分到16。
mke2fs /dev/fd0 // 格式化軟盤爲ext2:linux標準檔案系統,包括inode table(檔案的屬性以及內容的指針),block area(檔案的內容)
-j // ext3
-b -i // 修改 block, inode 大小
-c -L // 檢查, 標籤
e2label 分區 label
mount -t ext2 /dev/sdb /home // 掛載 參數 誰 掛在哪裏
mount -t nfs -o nolock,rsize=1024,wsize=1024 XXXIP:/share /home/ding // 把網絡上其他用戶的共享文件夾,掛載到本地文件夾
mount //IP/winFolder /linux/folder -o username=wh1103028,passwd=wh118991! // 把window下的文件夾,掛載到linux下。
cat /etc/fstab // 設定開機時即掛載的方式 # <file system> <mount point> <type> <options> <dump> <pass>
寫到 fstab(smbfs == cifs) : //IP/VOIP /home/.../voip cifs defaults,auto,username=admin,passwd=wh1103028! 0 0
-a -l -h -V // 掛fstab中的, 顯示目前掛的 , 幫助, 版本
mount -o remount,rw / // 根目錄重新掛載爲讀寫
unmount /dev/sda // if 強制,退出目錄後執行,卸載後才能把磁盤移走
切割與格式化硬盤:分區fdisk, 格式化mke2fs, e2label, mknod,
檢查硬盤壞軌與數據同步化寫入:磁盤檢查fsck, badblocks, sync,
關於軟盤開機片: 啓動mkbootdisk, 低格fdformat,
虛擬內存 Swap: swap partition, swap file, dd, mkswap, swapon, swapoff,
VI
Vi有三種基本的工作模式:指令模式、文本輸入模式、行末模式。
指令模式(Command Mode) 輸入 a、i、o >>> 文本輸入模式(Input Mode)
<<<按ESC進入
指令模式(Command Mode) 輸入 : 冒號>>> 末行模式(Last line Mode)
<<<指令錯誤
指令模式
光標 : 光標移動同方向鍵 ( h 左 j 下 k 上 l 右) ; 第一列的上,中,下(H M L)
命令: x(刪除當前光標字符) / X(刪除光標前的字符) d(刪除一行) / D(刪除一行中從光標開始後面的字符)
i(光標前添加字符) / I (行首插入) a(光標後面添加字符) / A(行尾添加) o(下方插入空行) / O(上方)
末行模式
顯示行號: :set nu
退出: :wq :q! (不保存) :x
查詢: /hi (查找hi) n(順序找下一個) / N(反序)
替換:
複製:
指令模式下: 複製3行/粘貼:3yy/p; 複製部分:v --->l------>y, p
末行模式下: 1, 3 co 5 //1到3行復制到第五行; 命令:co, m, d, // copy, move, delete
指令+末行 : 用ma,mb,mc在指令模式下做標誌, 'a, 'b m 'c // 把a,b標記之間的行復制到c處
多個文件之間的複製
vi -o 1.sh 2.sh 或者 :sp 2.sh // ctrl + ww == ^ww, 進行切換; sp == split
linux bin文件的製作: bin = install.sh(安裝腳本) + xxx.tar.gz(安裝文件)
cat install.sh xxx.tar.gz > yyy.bin (因此,bin中的install.sh需要把它後面的二進制數據恢復成xxx.tar.gz,然後執行安裝過程)
sed -n -e '1,/^exit 0$/!p' $0 > "${dir_tmp}/xxx.tar.gz" 2>/dev/null //去掉第一行到"exit 0"間的數據,後面的數據保存爲xxx.tar.gz