標籤:

Linux基礎--vim以及bash

Linux基礎--vim以及bash

1.vim

1.1 vim是什麼?

vim是文本編輯器,vi的高級版本

  • 一般模式 , 可以移動游標、刪除字元或者行、複製粘貼
  • 編輯模式 , 可以編輯文件內容
  • 命令行模式, : / ?查找、替換

1.2 常用按鍵說明

移動游標

  • hjkl:游標←↓↑→
  • Ctrl+f/b:向前/後翻頁
  • n空格:向右移動n個字元距離
  • home/end:到行首/行尾
  • G/nG/gg:最後一行/n行/第一行

查找與替換

  • /word:向下找
  • ?word:向上找
  • n/N:重複前一個查找/反向重複前一個查找
  • :n1,n2s/word1/word2/g:word1替換成word2
  • :1,$/word1/word2/g:全文替換
  • :n1,n2s/word1/word2/gc:替換前詢問

刪除、複製與粘貼

  • x/X:向後/向前刪除一個字元
  • nx:向後刪除n個字元
  • dd:刪除一行
  • ndd:向後刪除n行
  • yy:複製一行
  • nyy:向後複製n行
  • p/P:將已複製數據在下一行/上一行粘貼

撤銷與復原

  • u:復原
  • Ctrl+r:重做

進入編輯模式

  • i/I:當前游標所在處插入
  • a/A:下一個字元/所在行最後一個字元處插入
  • o/O:下一行/上一行插入新的一行
  • r/R:替換
  • esc:退出編輯模式

保存

  • :w:保存
  • :q:退出
  • :q!:不保存強制退出
  • :wq:保存並退出
  • :w [filename]:另存為
  • :set nu:顯示行號
  • set nonu:取消顯示行號

1.3 文件恢復

如果未保存就系統死機,會有swp文件,如果R恢復之後要手動刪除

1.4 塊選擇

  • v,y,p 選擇多行並粘貼
  • ctrl+v:可以用長方形的方式選擇數據

1.5 多窗口功能

  • :vsp/:sp:一個窗口垂直、水平顯示多個文件
  • ctrl+w ←→:不同窗口間切換

1.6 vim環境設置

  • ~/.vimrc整體vim的設置值

2. BASH

2.1 shell

通過shell將輸入的命令與內核kernel通信,從而內核可以控制硬體正確工作。

狹義的shell指命令行,廣義的包括圖形界面

bash是shell的一個版本

/bin/bash是linux默認的shell

2.2 bash shell功能

  • history命令記憶
  • tab命令補全
  • alias別名設置
  • 前後台控制
  • 腳本script
  • 通配符

type查看是bash內置還是外部命令

[root@jenkins154 ~]# type lsls is /usr/bin/ls

轉移enter可以分兩行輸入命令

2.3 變數

  • echo unset變數的顯示與設置與取消

[root@jenkins154 ~]# echo $variable [root@jenkins154 ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@jenkins154 ~]# echo ${PATH}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@jenkins154 ~]# echo $myname[root@jenkins154 ~]# myname=VBird #變數賦值[root@jenkins154 ~]# echo $myname #顯示變數VBird[root@jenkins154 ~]# name="VBirds name" #雙引號可以保有變數的內容[root@jenkins154 ~]# echo $nameVBirds name[root@jenkins154 ~]# name=$nameyes #錯誤累加[root@jenkins154 ~]# name="VBirds name"[root@jenkins154 ~]# name=${name}yes #正確累加[root@jenkins154 ~]# echo $nameVBirds nameyes[root@jenkins154 ~]# cd /lib/modules/`uname -r`/kernel #`內的會先被執行,結果再作為信息輸入[root@jenkins154 kernel]# pwd/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel[root@jenkins154 kernel]# unset name[root@jenkins154 kernel]# echo $name[root@jenkins154 kernel]# name=VBird[root@jenkins154 kernel]# echo $nameVBird[root@jenkins154 kernel]# myname="$name its me" #雙引號可以保有變數的內容[root@jenkins154 kernel]# echo $mynameVBird its me[root@jenkins154 kernel]# myname=$name its me[root@jenkins154 kernel]# echo $myname$name its me

  • env set

env查看環境變數

[root@jenkins154 kernel]# envXDG_SESSION_ID=21558HOSTNAME=jenkins154TERM=xterm-newSHELL=/bin/bash #目前環境使用的shell,這個linux默認shellHISTSIZE=1000 #history條數SSH_CLIENT=10.79.102.189 60294 22SSH_TTY=/dev/pts/22USER=rootLS_COLORS=MAIL=/var/spool/mail/rootPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/dmtsai/bin #執行文件查找的路徑PWD=/lib/modules/3.10.0-693.5.2.el7.x86_64/kernelLANG=en_US.UTF-8HISTCONTROL=ignoredupsSHLVL=1HOME=/root #用戶主文件夾LOGNAME=rootSSH_CONNECTION=10.79.102.189 60294 10.140.122.154 22LESSOPEN=||/usr/bin/lesspipe.sh %sXDG_RUNTIME_DIR=/run/user/0OLDPWD=/root_=/usr/bin/env

set查看所有變數包含環境變數與自定義變數

[root@jenkins154 kernel]# set|grep PS1PS1=[u@h W]$

  • PS1是提示符的設置
  1. u 目前用戶賬號
  2. h 主機名第一個小數點前的名字
  3. W最後一個目錄名
  4. A顯示24小時格式的時間
  5. #執行的第幾個命令
  • ?上個命令的回傳碼

[root@jenkins154 kernel]# echo $SHELL/bin/bash[root@jenkins154 kernel]# echo $?0[root@jenkins154 kernel]# 12name=VBirdbash: 12name=VBird: command not found...[root@jenkins154 kernel]# echo $?127

  • export 自定義變數轉成環境變數

差異在於該變數是否會被子進程繼續引用,子進程只會繼承父進程的環境變數

[root@jenkins154 kernel]# name=VBird[root@jenkins154 kernel]# bash #進入子進程[root@jenkins154 kernel]# echo $name[root@jenkins154 kernel]# exitexit[root@jenkins154 kernel]# export name[root@jenkins154 kernel]# bash[root@jenkins154 kernel]# echo $nameVBird[root@jenkins154 kernel]# exitexit

  • locale影響顯示結果的語系變數

[root@jenkins154 kernel]# localeLANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"LC_TIME="en_US.UTF-8"LC_COLLATE="en_US.UTF-8"LC_MONETARY="en_US.UTF-8"LC_MESSAGES="en_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_TELEPHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=

  • 變數的有效範圍

環境變數=全局變數

自定義變數=局部變數

變數鍵盤讀取、數組與聲明 declare

[root@jenkins154 kernel]# read atest #讀取鍵盤輸入This is a test[root@jenkins154 kernel]# echo $atestThis is a test[root@jenkins154 kernel]# read -p "Please enter your name: " -t 30 namedPlease enter your name: VBird Tsai[root@jenkins154 kernel]# echo $namedVBird Tsai[root@jenkins154 kernel]# sum=100+300 [root@jenkins154 kernel]# echo $sum #文字類型100+300[root@jenkins154 kernel]# declare -i sum=100+300#定義為整數類型[root@jenkins154 kernel]# echo $sum400[root@jenkins154 kernel]# declare -x sum #相當於export,定義環境變數[root@jenkins154 kernel]# export |grep sumdeclare -ix sum="400"[root@jenkins154 kernel]# declare -r sum #只讀[root@jenkins154 kernel]# sum=tesgting #不能改-bash: sum: readonly variable[root@jenkins154 kernel]# declare +x sum #取消操作[root@jenkins154 kernel]# declare -p sum #-p單獨列出變數類型declare -ir sum="400"[root@jenkins154 kernel]# var[1]="small min"[root@jenkins154 kernel]# var[2]="big min"[root@jenkins154 kernel]# var[3]="nice min"[root@jenkins154 kernel]# echo "${var[1]}, ${var[2]}, ${var[3]}" #讀取數組的方式small min, big min, nice min

  • ulimt

-f: 限制文件容量

-a: 列出所有限制額度

  • 變數內容刪除與替換

${path#/*kerberos/bin:} 從變數最前面開始向右刪除,僅刪除最短的

${path##/*:}從頭開始刪除最長的

${path%:*bin}從後面開始向前刪除,刪除符合的最短的

${path%%:*bin}從後面開始向前刪除,刪除符合的最長的

${path/sbin/SBIN}第一個舊字元被替換

${path//sbin/SBIN}全部的舊字元被替換

2.4 別名

  • alias unalias

[root@jenkins154 kernel]# alias lm=ls -l | more[root@jenkins154 kernel]# lmtotal 24drwxr-xr-x. 3 root root 16 Dec 4 13:56 arch......[root@jenkins154 kernel]# unalias lm[root@jenkins154 kernel]# lmbash: lm: command not found...

  • history

歷史命令

[root@jenkins154 kernel]# history #內存中所有......[root@jenkins154 kernel]# history 3 #最近3條 1084 history 3 1085 history 1086 history 3[root@jenkins154 kernel]# !1084 #執行第n條history 3 1084 history 3 1085 history 1086 history 3[root@jenkins154 kernel]# !! #執行上一個命令

2.5 BASH的環境操作

  • 命令查找順序

[root@jenkins154 kernel]# alias echo=echo -n[root@jenkins154 kernel]# type -a echoecho is aliased to `echo -necho is a shell builtinecho is /usr/bin/echo

1.相對/絕對路徑執行命令

2. alias找到

3. bash內置

4.$PATH變數的順序找到的第一個

  • 環境配置文件

login shell與non-login shell是否需要登錄

/etc/profile>~/.bash_profile>~/.bashrc(如果存在)

[root@jenkins154 kernel]# cat ~/.bash_profile# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then . ~/.bashrcfi# User specific environment and startup programsPATH=$PATH:$HOME/binexport PATH

  • source不用註銷登錄就可以把文件內容讀入shell環境中

2.6 數據流重定向

  • 標準輸出與標準錯誤輸出

1> 以覆蓋的方式將正確的數據輸出到指定的文件或設備上

1>>以累加的方式將正確的數據輸出到指定的文件或設備上

2>以覆蓋的方式將錯誤的數據輸出到指定的文件或設備上

2>>以覆蓋的方式將錯誤的數據輸出到指定的文件或設備上

[root@jenkins154 ~]# find /home name .bashrc 2> /dev/null #錯誤信息丟棄[root@jenkins154 ~]# find /home -name .bashrc > list_right 2> list_error #stdout與stderr分別存入不同文件[root@jenkins154 ~]# find /home -name .bashrc > list 2>&1 #正確錯誤數據寫入一個文件[root@jenkins154 ~]# find /home -name .bashrc &> list #同上

  • 輸入< 與<<將原本需要由鍵盤輸入的數據改由文件內容來代替

[root@jenkins154 ~]# cat > catfile #用鍵盤輸入,ctrl+d離開testingcat file test[root@jenkins154 ~]# cat > catfile < ~/.bashrc #用文件內容代替鍵盤輸入[root@jenkins154 ~]# ll catfile ~/.bashrc #大小一模一樣-rw-r--r-- 1 root root 176 Jun 3 22:11 catfile-rw-r--r--. 1 root root 176 Dec 29 2013 /root/.bashrc[root@jenkins154 ~]# cat > catfile << "eof" #輸入eof就結束,<<> This is a test.> OK now stop> eof

  • ||,&&,;

;表示一次執行多個命令

cmd1&&cmd2,cmd1正確才執行cmd2,錯誤不執行

cmd1||cmd2,cmd1正確cmd2不執行,錯誤才執行

[root@jenkins154 ~]# ls /tmp/abc && touch /tmp/abc/hehe #不執行touchls: cannot access /tmp/abc: No such file or directory[root@jenkins154 ~]# mkdir /tmp/abc[root@jenkins154 ~]# ls /tmp/abc && touch /tmp/abc/hehe #執行touch,hehe被創建[root@jenkins154 ~]# ll /tmp/abctotal 0-rw-r--r-- 1 root root 0 Jun 4 21:52 hehe[root@jenkins154 ~]# rm -r /tmp/abc[root@jenkins154 ~]# ls /tmp/abc || mkdir /tmp/abc #創建abcls: cannot access /tmp/abc: No such file or directory[root@jenkins154 ~]# ll /tmp/abctotal 0[root@jenkins154 ~]# ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe[root@jenkins154 ~]# ll /tmp/abc/hehe-rw-r--r-- 1 root root 0 Jun 4 22:07 /tmp/abc/hehe

command1 && command2 || command3

如果判斷有三個就要這麼寫

2.7 管道命令

  • | 處理經由前面一個命令傳來的正確信息

ls -al /etc | less # ls輸出後的內容可以被less讀取

  • cut 將同一行的數據進行分解

[root@jenkins154 ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@jenkins154 ~]# echo $PATH | cut -d : -f 5 # 以:分隔取第五個/root/bin[root@jenkins154 ~]# last | cut -d -f 1 #只看登錄用戶

  • grep 取出想要的

[root@jenkins154 ~]# last |grep root #有root就取出來[root@jenkins154 ~]# last |grep -v root #沒有root的取出來[root@jenkins154 ~]# last |grep root|cut -d -f1 #有root就取出,取第一列

  • sort 排序

[root@jenkins154 ~]# cat /etc/passwd | sort #按第一個字元排序[root@jenkins154 ~]# cat /etc/passwd | sort -t : -k 3 -n #按照第三列以數字排序

  • uniq 重複行刪掉僅顯示一個

[root@jenkins154 ~]# last | cut -d -f1 | sort | uniq #僅取出賬號列,排序後每種只顯示一個rebootroot(unknownwtmp[root@jenkins154 ~]# last | cut -d -f1 | sort | uniq -c # 想知道登錄次數 1 4 reboot 492 root 1 (unknown 1 wtmp

  • wc 統計行數字數

[root@jenkins154 ~]# cat /etc/man.config | wc #顯示行、字數、字元數cat: /etc/man.config: No such file or directory 0 0 0[root@jenkins154 ~]# last | grep [a-zA-Z] | grep -v wtmp | wc -l#登錄系統總人數497

  • tee 同時將數據流送與文件與屏幕

[root@jenkins154 ~]# last | tee last.list | cut -d " " -f1 #將last的輸出存一份到last.list文件同時在屏幕顯示[root@jenkins154 ~]# ls -l /home | tee ~/homefile| more # ls輸出存一份到homefile同時屏幕有顯示total 4drwx------. 5 jenkins jenkins 4096 Feb 1 10:44 jenkins[root@jenkins154 ~]# ls -l / | tee -a ~/homefile | more

  • tr 刪除或替換字元

[root@jenkins154 ~]# last | tr [a-z] [A-Z] #小寫替換成大寫[root@jenkins154 ~]# cat /etc/passwd | tr -d : #刪除:

  • col
  • join 有相同數據行的加在一起

[root@jenkins154 ~]# head -n 3 /etc/passwd /etc/shadow==> /etc/passwd <==root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin==> /etc/shadow <==root:$6$MvngunjJ$fgam465cx0mRfNqFkM7m/eLGoTJ.K80CjK4Tx5a5wA.TlZX.RKwFT5Y3JRL31/Qcm66BmqUsegHranqr0FK12/:17637:0:99999:7:::bin:*:16231:0:99999:7:::daemon:*:16231:0:99999:7:::[root@jenkins154 ~]# join -t : /etc/passwd /etc/shadowroot:x:0:0:root:/root:/bin/bash:$6$MvngunjJ$fgam465cx0mRfNqFkM7m/eLGoTJ.K80CjK4Tx5a5wA.TlZX.RKwFT5Y3JRL31/Qcm66BmqUsegHranqr0FK12/:17637:0:99999:7:::bin:x:1:1:bin:/bin:/sbin/nologin:*:16231:0:99999:7:::daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:16231:0:99999:7:::

  • paste 直接將兩行貼在一起

推薦閱讀:

ubuntu下搭建自己的伺服器
監控程序如何編寫單元測試?
為什麼Linux安全,而安卓不安全呢?
linux 分區有什麼好處?哪些是必要的?
代碼使用std::thread,使用-static -lpthread靜態編譯後,運行段錯誤的問題?

TAG:Vim | Linux |