souther-blog

---恢复内容开始---

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 Git

  • 网络操作
    • 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 #查看文件系统状况

      ---恢复内容结束---


      下一篇会详细对一些复杂的命令进行分析和学习,加油啦!

相关文章: