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) - 以上只支持整数
- let result=a+b
- 数组:
- 普通数组,数字索引
- array=(test1 test2 test3)
array[0]=test1 … - echo $(array[*])
echo $(#array[*])
- array=(test1 test2 test3)
- 关联数组,需要先声明 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的文件名
- top | grep xfr > xfr.log 2>&1
- (子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#*.} #贪婪
- export PATH=/usr/lib:$PATH
- 文件管理
-
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
-
comm
- 文本处理
-
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}}’
-
wc
- 网络操作
-
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
- 详解
-
wget
- 版本管理 GIT详解
-
status and diff
- git clone git@github.com:nanan1993/learn.git ; git status #干净的工作目录
- On branch master
nothing to commit, working directory clean
- On branch master
- touch add_file; git status #新建文件,但是没有跟踪
- Untracked files:
(use “git add …” to include in what will be committed)
add_file
- Untracked files:
- git add add_file; git status #建立跟踪,可以看到这个已经staged了
- Changes to be committed:
(use “git reset HEAD …” to unstage)
new file: add_file
- Changes to be committed:
- 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 clone git@github.com:nanan1993/learn.git ; 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
- git reset –soft HEAD^
-
撤销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 , 喝水不忘夸奖挑水人
- 各个对象的关系看起来是这样的, 文件快照保存在blob,tree是blob的一个集合(相当于一次工程目录的快照),commit指向一个tree,
-
开发流程
- 最后提一下git的开发流程,合作的话呢
- 先init一下本地的git环境,推荐把本地的公钥传到网上去这样不用输密码啥的了
- fork下,把你想要贡献的代码fork到自己仓库
- clone到本地
- checkout dev #自己的开发分支
- 码代码
- checkout到远程仓库的主分支,fetch下看看有没有新的改动,同步下来
- merge dev
- push到自己的仓库
- 提一个merge request,之前先compare一下,检查检查
- 收工
- 最后提一下git的开发流程,合作的话呢
感谢:Pro Git
-
status and diff
- 网络操作
- 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
- host google.com
- 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
- 路由表图示例:
- 如何用命令行方式给linux机器添加一个默认网关,假设网关地址为10.0.0.254?
- 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进行访问了
- ssh user@host
- 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 #查看文件系统状况
—恢复内容结束—
下一篇会详细对一些复杂的命令进行分析和学习,加油啦!