shell命令一(基礎)
shell命令總結(基礎)
基礎
- 特殊符號
- 提示符:$ 普通用戶, # root用戶
- 雙引號會對字符串作解釋,單引號不會
- $0: shell name
- $?:上一個命令的推出狀態
- $@:全部參數
- $#:全部參數的個數
- $*:全部參數連續打出來
- 語法
- "A=B"賦值; "A = B"判等
- length_of_var=${#var}
- ${parameter:+expression}若是parameter有值且不爲空,則使用expression的值
- 算術運算:
- let result=a+b
let a++
- result=$[ a + b ]
- result=
expr a+b
result=$(expr a+b)
- 以上只支持整數
- 數組:
- 普通數組,數字索引
- array=(test1 test2 test3)
array[0]=test1 ...
- echo $(array[*])
echo $(#array[*])
- 關聯數組,須要先聲明 declare -A array
- [ "$a" == "on" ] && cmd1 : cmd2
cmd1 && cmd2 表示僅當cmd1返回值爲1時執行cmd2
cmd1 || cmd2 表示僅當cmd1返回爲0時,執行cmd2
- 條件判斷的時候通常用[] 可是若是是字符串比較的時候最好使用[[]]
- cd -
- 基本命令
- export PATH=/usr/lib:$PATH
- 環境變量 PATH=/usr/lib:/lib 查找的時候有順序的
- 重定向問題:
- top | grep xfr > xfr.log 2>&1
top | grep xfr > xfr.log 2>>&1
- cat file | tee out.txt | cat -n #tee只能從標準輸入中讀取,並分別輸出到指定區域和標準輸出中
- cat <
test.log #該命令後能等待用戶輸入知道EOF
- exec 3<file #以fd==3打開file文件。模式爲可寫
- cat - file #-是stdin的文件名
- (子shell)
`cmd反引用`
- cat
- cat -s file#去掉空白行
- cat -T file.py #把製表符以^I的形式打印出來,用於排查python的格式問題
- cat -n file
- find
- find . #列出全部文件和子目錄
- find . -print0 #用'\0'來分隔
- find . -type [f,d,l] -[iname or name] "*.text"
- find . -type f (-path '*.txt' [-and,-a,-or,-o] -path 'a.*')
- find . -regex '.*.(py|sh)$' #正則表達式
- 支持對文件的操做 find . -type f -user root -exec chown wu {} ; #必須以;結尾
- xargs
- xargs默認調用echo命令
- cat arms.txt | xargs -d X -n 3 #每次調用命令時用3個參數 #用X做爲分隔符拆解
- cat arms.txt | xargs -I {} find . -f {}.txt #-I設置佔位符
- tr
- echo "HELLO WORLD" | tr 'A-Z' 'a-z'
- echo "hello 123 world" | tr -d '0-9'
- cat mult_blanks.txt | tr -s '\n'
- base64
- base64 a.jpg > out.file
- base64 -d a.jpg > out.file
- sort
- sort -nr file.txt | uniq #-n 按照數字排序
- sort -k 2 file.txt | uniq -c #按照第二列排序 輸出個數
- split
- split -b 10k data.file -d -a 4 splited_filename_prefix
- split -l 100 data.file
- split server.log /SERVER/ -n 2 -f server -b "%02d.log"
- 正則相關
- name=${file_jpg%.*} #非貪婪
- extension=${file_jpg#*.} #貪婪
- 文件管理
- comm
sort a.txt -o a; sort b.txt -o b
comm a b -1 -2
#取ab中的交集
sort a.txt -o a; sort b.txt -o b
comm a b | tr -d '\t'
#取ab中不一樣的行
sort a.txt -o a; sort b.txt -o b
comm a b -2 -3
#a-b
- 文件權限問題
- drwxr-xr-x file :第一位是文件類型,-:普通文件,d:目錄等等;其餘部分分別爲user,group,orher的讀寫和執行權限
- chmod u=rwx, g=rw, o=r filename
- chmod o+x; chmod a+x #all
- chown slynux:users test.sh #更改test全部權到 slynux:users
- chmod 777 ./dir -R
- ln -s model_tensorrt models
- find . -type l -print
- file a.jpg
- 掛載環迴文件
- dd if=/dev/zero of=loopbackfile.img bs=1G count=1 #申請1g空間,初始化爲0
- mkfs.ext4 loopbackfile.img #格式化
- mount -o loop loopbackfile.img /mnt/loopback #掛載
- 或者
- losetup/dev/loop1 loopbackfile.img
- mount /dev/loop1 /mnt/loopback
- fdisk /dev/loop1 #對文件進行分區
- losetup -o 32256 /dev/loop2 loopback.img #掛載第一個分區
- diff patch
- diff -u test_version1.txt test_version2.txt > test.patch
- patch -p1 test_version1.txt < test.patch #第一次執行將補丁打在version1上,第二次執行撤銷
- head -n 4 a.txt
- tail -n 4 a.txt
- 文本處理
- wc
- tree -h #打印樹形目錄
- grep
- grep -E "[a-z]+" file #正則表達式
- grep "/xfr/api/detect" file | grep "2019-01-01 13:00:00" -c #QPS,and
- grep "fail to init xtrace" -n file #肯定搜索到在第幾行
- grep 'pattern1|pattern2' xfr.log
grep -e pattern1 -e pattern2
grep -E 'pattern1|pattern2'
- grep "test" filelist -lZ | xargs -0 rm #-Z用‘\0’分隔查找結果
- grep "test" xfr.log -C 3 #上下文
- cut
- cut -f 2,3 file
- cut -f 2 -d ";" file
- sed
- sed 's/a/b/' file
- sed -i 's/a/b' file
- sed 's/a/b/g' file
- sed '/^$/d' file
- sed 's/[0-9]{3}/0/g'
- echo this is an example | sed 's/\w+/[&]/g' #[this] [is] [an] [example]
- sed 's:/*.**/::g' #刪除註釋
- awk
- awk 'BEGIN{} pattern {cmd} END{}' file
- awk '{print $NR, $NF, $0, $1, $2}' file #輸出 行號,字段數,文本,文本第一字段,二字段
- awk '/pattern/'
awk 'NR<5'
- awk -F ; 'print $1'
- awk '{for(i=0;i<10;i++){print $0}}'
- 網絡操做
- wget
- wget -t 5 url
- wget -c url
- curl
- curl url --cookie-jar cookie_file --user-agant "Mozilla/5.0"
- curl http://127.0.0.1:8080/check_your_status?user=Summer&passwd=12345678 #GET
- curl -H "Content-Type:application/json" -X POST --data '{"message": "sunshine"}' http://localhost:8000/ #POST
- 詳解
- 版本管理 GIT詳解
- status and diff
- git clone git@github.com:nanan1993/learn.git ; git status #乾淨的工做目錄
- On branch master
nothing to commit, working directory clean
- touch add_file; git status #新建文件,可是沒有跟蹤
- Untracked files:
(use "git add
..." to include in what will be committed)
add_file
- git add add_file; git status #創建跟蹤,能夠看到這個已經staged了
- Changes to be committed:
(use "git reset HEAD
..." to unstage)
new file: add_file
- echo "add a word" >> add_file; git diff #修改文件,直接diff
- git status
- git add add_file; git diff --cached #stage之後, diff已經看不到了,須要diff --cached,diff是尚未暫存起來的變化,diff --cached是顯示已經暫存起來的變化
- git commit -m "add_file" ; git status
- git log,建議用圖形化工具代替
- git log -p #詳細顯示commit代碼改動狀況
- git log #只顯示commit
- git 回退
- commit回退
- git commit -m 'initial commit' #提交操做有誤
- git add forgotten_file #補充一個文件
- git commit --amend #amend下,新的commit會帶上 forgetten_file,覆蓋上一個commit
- add回退
- git add -A #此時發現 文件a.txt不該該提交
- git reset HEAD a.txt # git 會提示你,撤銷對a的stage
- 文件修改回退
- git checkout -- a.txt #沒有stage的修改會被撤銷,沒法找回
- commit 版本回退
- git reset --soft HEAD^
git reset --soft HEAD~1 #撤銷上一次commit,保留代碼,保留staged
- git reset --soft HEAD^ #撤銷,保留代碼,撤銷staged
- git reset --hard HEAD^ #撤銷,不保留代碼
- git reset --soft e7d5fa76488 #回退到特定的commit
- 撤銷push
- 本地commit調整到須要的版本
- git push or igin branch --force
- 回退操做的回退=。=
- git reflog能夠看到歷次head指向標籤的變化,雖然head的指向變化了,可是對應的快照應該仍是在這個數據庫裏面的,還能夠找回來,這個很關鍵!
- reset到某個標籤就可以回退到某個以前的版本
- 平常操做
- git init
- git clone
- git add file
- git commit -m "comment"
- git push or igin master
- git tag -a v1.4 -m 'my version 1.4'
- git push origin v1.4
- git remote -v
- git remote add [shortname] [url]
- git remote rename name1 name2
- git remote rm remote_name
- git checkout -b dev
- git checkout -b dev origin/dev #從遠程分支上面拉取
- git fetch upstream
- git checkout master; git merge dev #合併遠程分支
- 這個時候可能須要解決合併衝突的,這個其實也沒有初學者想的這麼麻煩,就是會出現
<<<<<<HEAD
first version
=========
second version
>>>>>>>>>dev
這個樣子,上面是當前分支的,下面是另外一個分支的,處理下,還有不少可視化工具能夠作這件事情的,不推薦強行用命令行,開心一點很差嗎?
- git平常坑爹操做
- 這個我犯過幾回錯誤了,和你們分享下
- 若是我在master上面修改了一個文件,這個修改可能stage了,可是沒有提交,那麼若是這個時候你checkout到dev分支上,這個改動會跟着你一塊兒走,若是這個改動和dev上面的是衝突的,你可能checkout不過去。可是可怕的是不衝突的話你會帶着這些改動到dev分支,若是你在dev上面進行commit的話,這些改動就會應用到dev分支上面去了,而與此同時master將會失去這些commit掉的代碼,致使你莫名其妙發現少了一些代碼。固然,沒有commit的代碼會被帶着走,可是這就形成了代碼的混亂,查起來很是麻煩。
- 基本文件系統
- 各個對象的關係看起來是這樣的, 文件快照保存在blob,tree是blob的一個集合(至關於一次工程目錄的快照),commit指向一個tree,
-
- 屢次commit之後的狀態是這樣的(一個分支),commit對應了各個快照集合,commit之間的前後關係也被記錄下來
- branch實際上就是一個指向某個commit的指針
- 當前文件的狀態其實是一個HEAD決定了,它是指向了branch的指針
- 可能開發一段時間就變成了
- 嗯。。。能夠說很清晰了 說到這裏,這些圖還有一些知識點來自Pro Git , 喝水不忘誇獎挑水人
- 開發流程
- 最後提一下git的開發流程,合做的話呢
- 先init一下本地的git環境,推薦把本地的公鑰傳到網上去這樣不用輸密碼啥的了
- fork下,把你想要貢獻的代碼fork到本身倉庫
- clone到本地
- checkout dev #本身的開發分支
- 碼代碼
- checkout到遠程倉庫的主分支,fetch下看看有沒有新的改動,同步下來
- merge dev
- push到本身的倉庫
- 提一個merge request,以前先compare一下,檢查檢查
- 收工
感謝:Pro Githtml
- 網絡操做
- ifconfig wlan0 192.168.0.80 netmask 255.255.252.0 #設置ip/mask
- ifconfig eth0 hw ether 00:1c:bf:23:aa:3d #設置mac地址
- dns服務器: /etc/resolv.conf
- host google.com
nslookup google.com #查看DNS映射關係
- /etc/hosts 保存了 IP_ADDRESS name1 name2 #能夠自定義域名和ip的映射
- echo "192.168..0.9 backserver" >> /etc/hosts #之後將backserver統一映射到192.168.0.9
- route #打印路由表
route有不少功能,經過面試題來簡單瞭解一下
- 如何用命令行方式給linux機器添加一個默認網關,假設網關地址爲10.0.0.254?
- route del default gw 10.0.0.123 #刪除舊的默認網關
- route add default gw 10.0.0.254
- route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.0.0.254 #和上一個等價
- 192.168.1.0網段, 192.168.1.1網關的某一服務器想連入172.16.1.0/24段,該如何添加路由
- route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.0.1
- route add -new 172.16.1.0/24 gw 192.168.0.1
- 路由設置之後重啓會失效,須要寫入文件,不在贅述
- 若是添加一個主機路由
- route add host address gw 192.168.0.1
- route add host address dev eth2
- 路由表圖示例:
- traceroute destinationIP #跟蹤路由狀態
- ssh
- ssh user@host
command1;command2
#遠程執行 本地顯示
- ssh -X user@host
command1
#執行遠程命令,並使用本地主機上的X服務器
更進一步說,X服務器是一個組件,它對圖像數據流進行處理之後,對視窗進行操做,從而顯示圖像,圖像顯示功能,實際上並非linux kernel的一部分
- 端口轉發:
- ssh -L 8000:www.kernel.org:80 user@localhost #將localhost:8000轉發到 www.kernel.org:80
- ssh -L 8000:www.kernel.org:80 user@remote #將user@remote:8000轉發到www.kernel.org:80
- ssh -R 8000:localhost:80 user@remote #將遠程主機端口8000轉發到本地主機80,這個是提供反向代理用的,假設我有個server,ABC都沒法直接訪問,而server可以直接訪問A,那麼我能夠在A和server之間創建一個反向代理,那麼A就能夠訪問server,BC也就能夠經過A對server進行訪問了
- lftp 使用ftp協議傳輸,能夠 get filename 或者 put filename
- lsof -n | awk '{print($2)}' | sort | uniq -c | sort -nr | more #當前打開句柄數
- netstat -anp #這個很經常使用了
- 一個添加網橋的例子,用來熟悉一下操做
- ip link add br0 type bridge
- ip link set dev eth1 master br0 #把eth1加入到網橋
- ifconfig br0 10.0.0.2
- echo 1> /proc/sys/net/ipv4/ip_forward #啓用分組轉發
- 咱們假設eth0鏈接到子網192.168.1.0,10.0.0.0/24的主機但願經過網橋到達這個子網
- route add 192.168.1.0/16 gw 10.0.0.2
- iptables詳見iptables 詳解
- iptables -A OUTPUR -d 8.8.8,8 -j DROP
- iptables -A OUTPUR -p tcp -dport 21 -j DROP
- iptables -I INPUT -s 1.2.3.4 -j DROP
- -A #向鏈中追加
-I #向鏈頭插入
-d dst
-s source
-j #動做
- 文件系統操做
- fdisk -l #查看設備
- mount /dev/sda1 / #掛載
- df -h #查看文件系統情況
---恢復內容結束---python
下一篇會詳細對一些複雜的命令進行分析和學習,加油啦!
歡迎關注本站公眾號,獲取更多信息