程序员手记
Linux
终端快捷键
光标移动
| 快捷键 | 作用 |
| ————- | ————————————————— |
|crtl+a
| 移动到开头 |
|crtl+e
| 移动到结尾 |
|alt+b
| 向左移动一个单词 |
|alt+f
| 向右移动一个单词 |
|crtl+b
| 向左移动一个字符 |
|crtl+f
| 向右移动一个字符 |
|esc+b
| 向左移动一个单词 |
|esc+f
| 向右移动一个单词 |
|ctrl+XX
| 在上次光标和当前光标所在字符间跳转 |
|esc+t
| 交换光标位置钱的两个单词 |删除
| 快捷键 | 作用 |
| ———— | ———————————— |
|ctrl+k
| 删除光标后所有字符 |
|ctrl+u
| 删除光标前所有字符 |
|ctrl+w
| 删除光标前一个单词 |
|ctrl+d
| 删除光标所在字符(右侧) |
|ctrl+h
| 删除光标前字符(左侧) |撤销
| 快捷键 | 作用 |
| ———— | ——————————— |
|ctrl+_
| 撤销操作 |
|ctrl+y
| 粘贴ctrl+u/k剪切的内容 |
|ctrl+?
| 撤销前一次输入 |
|alt+r
| 撤销前一次动作 |替换
| 快捷键 | 作用 |
| ———— | ——————————————— |
|ctrl+t
| 将光标当前字符与前一个字符替换 |历史命令编辑
| 快捷键 | 作用 |
| ———— | ——————————————— |
|ctrl+p
| 上一条历史命令 |
|ctrl+n
| 下一条历史命令 |
|alt+>
| 上一次执行的命令的最后一个单词 |
|ctrl+r
| 搜索历史命令 |控制命令
| 快捷键 | 作用 |
| —————— | ——————————— |
|ctrl+l
| 清除屏幕 |
|ctrl+s
| 锁住终端,阻止屏幕输出 |
|ctrl+q
| 解锁终端,允许屏幕输出 |
|ctrl+c
| 终止命令 |
|ctrl+i
| 补全,相当于tab |
|ctrl+o
| 重复执行命令 |
|alt+<数字>
| 操作的次数 |
|ctrl+z
| 挂起 |!命令
| 快捷 | 作用 |
| ——- | ——————- |
|!!
| 执行上条命令 |
|!-n
| 执行前n条命令 |shell中的 $ 用法
| 特殊符号 | 含义 |
| ———— | —————————————————————————————— |
| $# | 传给脚本的参数个数 |
| $0 | shell脚本文件的名字 |
| $1 | 传递给该shell脚本的第一个参数 |
| $2 | 传递给该shell脚本的第二个参数 |
| $@ | 传给脚本的所有参数的列表 |
| $* | 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 |
| $$ | 脚本运行的当前进程ID号,Shell本身的PID |
| $? | 显示最后命令的退出状态,0表示没有错误,其他表示有错误 |
| $! | Shell最后运行的后台Process的PID |
| $- | 使用Set命令设定的Flag一览 |
| $() | 相当于``,括号中放的是命令 |
| ${} | 括号中放的是变量。例如echo P A T H 取 P A T H 变 量 的 值 并 打 印 , 也 可 以 不 加 括 号 比 如 {PATH}取PATH变 量的值并打印,也可以不加括号比如PATH取PATH变量的值并打印,也可以不加括号比如PATH。 |
| $1~n | 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 |${}的特殊用法
sh, dash 都不能使用该语法
基础语法:${parameter,,pattern} / ${parameter^^pattern}
另外这个语法不会改变原变量
var="Hello,World"
第一个字符变为大写
echo ${var^}
所有字符变为大写
echo ${var^^}
第一个字符变为小写
echo ${var,}
所有字符变为小写
echo ${var,,}判断/比较
语法(用例)
if [ $SYSTEM = "Linux" ] ; then # 如果是linux话输出linux字符串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi # 判断结束,以fi结尾字符串判断
| 语法 | 含义 |
| —————— | ——————————————— |
| str1 = str2 | 当两个串有相同内容、长度时为真 |
| str1 != str2 | 当串str1和str2不等时为真 |
| -n str1 | 当串的长度大于0时为真(串非空) |
| -z str1 | 当串的长度为0时为真(空串) |
| str1 | 当串str1为非空时为真 |数字的判断
| 语法 | 含义 |
| ——————- | —————————— |
| int1 -eq int2 | 两数相等为真 |
| int1 -ne int2 | 两数不等为真 |
| int1 -gt int2 | int1大于int2为真 |
| int1 -ge int2 | int1大于等于int2为真 |
| int1 -lt int2 | int1小于int2为真 |
| int1 -le int2 | int1小于等于int2为真 |文件相关的if判断条件语句
| 语法 | 含义 |
| ———- | —————————————————————- |
| -r file | 用户可读为真 |
| -w file | 用户可写为真 |
| -x file | 用户可执行为真 |
| -f file | 文件为正规文件为真 |
| -d file | 文件为目录为真 |
| -c file | 文件为字符特殊文件为真 |
| -b file | 文件为块特殊文件为真 |
| -s file | 文件大小非0时为真 |
| -t file | 当文件描述符(默认为1)指定的设备为终端时为真 |复杂逻辑判断
| 语法 | 含义 |
| —— | —— |
| -a | 与 |
| -o | 或 |
| ! | 非 |[] 和 [[]] 的区别
if [[]] 要求括号里的表达式前后必须有一个空格,格式如 if [[ xxx ]]。
当 if [[]] 用于字符串常量或变量比较时,表达式本身的运算符,如 <、>、==、!= ,其前后可以不加空格;
但当 if [[]] 用于数值比较时,表达式本身的运算符前后必须加空格,否则会得到相反的结果。如:
if [[ $1 != "start" && $1 != "stop" ]]
在if之后要用空格,[[ 之后要有一个空格,]]之前要有空格,不然会出错.
elif [[ $1 == "stop" ]]
双等号两边要有空格不然后会出错.在shell中查看每条指令实际执行的结果
set +x
表示开始记录,set -x
表示停止记录。例子:
set +x
name="test"
echo $name
set -x实用小技巧
查找包含某个字符串的所有文件,可以用于后续的自动处理:
指令
grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq
用途
for script_name in `grep -r "desktop\." | awk '{print $1}' | sed 's/://g' | uniq`
do
echo y | edopkg pull $script_name
done日志管理
dmesg
命令可以查看系统的整个启动日志GIT
批量删除已合并分支
获取已合并分支
git branch --merged
筛选去除指定字符串(正则方式)
grep -i -v -E "master|dev"
以字符串结尾的
grep -i -v -E "x-master$|x-develop$|x-release$"
批量执行(要用管道)
xargs git branch -d
合起来
git branch --merged | grep -i -v -E "x-master$|x-develop$|x-release$" | xargs git branch -d删除远程跟踪分支
git remote prune origin
修改当前commit
git add . && git commit --amend --no-edit
该操作会修改当前最新commit并添加当前目录下所有修改了但未提交的文件。
如果最新commit已经push到远端,则需要再次强制推送到远端。查找某个commit被哪个branch和tag包含
查找被包含的branch:
git branch --contains commit_id --all
查找被包含的tag:git tag --contains tag_name
设置命令别名
git config --global alias.a add
git config --global alias.c commit
git config --global alias.o checkout也可以在config文件进行修改和查看,
在~/.gitconfig
或项目的.git/config
文件中,有以下信息,可以进行修改:[alias] a = add c = commit o = checkout # ...
还可以直接用别人写好的:
项目地址
使用方法:- 首先将该开源项目中的
gitalias.txt
文件下载下来 - 然后在
.gitconfig
文件里面加入:
[include]
path = gitalias.txt获取两个commit之间更改的文件
可以方便在
shell
或者bash
中执行自动化操作以最新的更新为例:
git diff --name-only HEAD HEAD^
执行自动化操作:for fp in `git diff --name-only HEAD HEAD^`; do echo $fp; done
Docker
删除虚悬镜像:
docker images --filter dangling=true
删除所有虚悬镜像:docker rmi $(docker images --filter dangling=true -q)
或
docker image prune
删除24小时前的虚悬镜像,-a 标签还支持删除所有未使用的镜像
docker image prune -f --filter until=24h列出latest镜像之前的所有镜像:
docker images aka-gm --filter before=aka-gm:latest
从以上输出中取出镜像的REPOSITORY与TAG:docker images aka-gm --filter before=aka-gm:latest --format "{{.Repository}}:{{.Tag}}"
排除TAG为的镜像并删除: docker images aka-gm -f before=aka-gm:latest | grep aka-gm | grep -v "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi
删除TAG为的镜像: docker images aka-gm -f before=aka-gm:latest | grep "<none>" | awk '{printf "%s:%s\n",$1,$2}' | xargs -r docker rmi
找出容器对应的日志滤镜:
docker inspect --format='{{.LogPath}}' containername
- 首先将该开源项目中的