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
      • wc -l #行數
    • 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

      下一篇會詳細對一些複雜的命令進行分析和學習,加油啦!
相關文章
相關標籤/搜索