1. 获取目录名或文件名
# 列出当前目录,所有目录名,没有目录会报错
ls -d */ | xargs basename -a
# 列出当前目录及子目录所有文件, f是文件,可以改为d,列出目录
find . -type f -print
2. 清空文件内容
cat /dev/null > tmp.txt
# 等价于
:> tmp.txt
# 使用填充文件
dd if=/dev/zero of=~/zero bs=1K count=12
3. 备份数据
cp test.{txt,txt.bak}
4. 笛卡尔积
# 使用大括号生成file1:A file1:B file1:C file2:A file2:B file2:C file3:A file3:B file3:C
echo {file1,file2,file3}:{A,B,C}
5. 时间格式化
# Y:年,m:月,d:日,H:24小时制,I:12小时制,M:分,S:秒
date +%Y-%m-%d
# u:星期1-7,w:星期0-6, 0代表星期日
6. 文件某行添加内容
sed -i "17i content" file.txt
7. 获取端口进程情况
netstat -tunlp |grep <端口号>
ps aux | head -1;ps aux | grep <进程名字>
8. 命令输出丢掉
# &>/dev/null 等价于 >/dev/null 2>&1
ls &>/dev/null
9. 文件或目录是否存在,不存在则创建
[ -d <目录名> ] || mkdir <目录名>
[ -f <文件名> ] || touch <文件名>
10. 在脚本中,使用sudo自动输入root账户密码
echo "<root/password>"|sudo -S <code/want/to/run>
11. 在awk, sed中使用外部变量
# awk或者sed 引入外部变量 "'$var'" ,变量有空格"'"$var"'"
NICS=`echo $line | awk '{printf $1"'$SEP'"$2"'$SEP'"; for(i=3;i<NF;i++) printf $i" "; printf $NF"\n"}'`
12. 判断linux版本
# 查看centos版本
cat /etc/redhat-release
# 查看ubuntu版本
cat /etc/issue
13. 读取键盘输入
# -t 时间不超过秒数, -n 输入字符不超过 -p 提示字符串
read -t 10 -n 3 -p "please input your name:" name
14. 比较两个文件差异性
cmp file1 file2
15. 创建时写入文件
cat>mail-list<<-EOF
文件内容
文件内容
...
EOF
16. 读取文件行
for line in `cat 文件`
do
echo $line
...
done
while read line
do
echo $line
done < 文件
cat 文件 | while read line
do
echo $line
done
17. grep 完全匹配
grep -x bash
18. find 查找区分大小的文件
find . -size 14k # 查找当前目录下及子目录下大小等于14k的文件
find . -size -14k # 小于14k文件
find . -size +14k # 大于14k文件
19. 统计输出行数
ls -l | wc -l
20. 获取输出前几行或后几行
ls -l | head -2 # 前两行
ls -l | tail -2 # 后两行
21. <<<的用法
grep 123 <<< 345123
# 类似于
echo 345123 | grep 123
# <<< 用于将后面的内容作为前面的标准输入
22. shell打印字体颜色
# 夹在 "\e["和 "m"之间的数字
# 如果指定一个以上的数字,则用分号将它们分开
# 例如:"\e[31;42m"
# 第一个数字(31)为前景颜色(红色);第二个数字为(42)背景颜色(绿色)
# 通过\e[0m设为正常值
#
颜色 | 字背景颜色代码 | 字颜色代码 |
---|---|---|
黑 | 40 | 30 |
红 | 41 | 31 |
绿 | 42 | 32 |
黄 | 43 | 33 |
蓝 | 44 | 34 |
紫 | 45 | 35 |
青 | 46 | 36 |
白 | 47 | 37 |
代码 | 效果 |
---|---|
\033[0m | 关闭所有属性 |
\033[1m | 设置高亮度 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 消隐 |
\033[30m – \033[37m | 设置前景色,见上面的表格 |
\033[40m – \033[47m | 设置背景色,见上面的表格 |
\033[nA | 光标上移n行 |
\033[nB | 光标下移n行 |
\033[nC | 光标右移n行 |
\033[nD | 光标左移n行 |
\033[y;xH | 设置光标位置 |
\033[2J | 清屏 |
\033[K | 清除从光标到行尾的内容 |
\033[s | 保存光标位置 |
\033[u | 恢复光标位置 |
\033[?25l | 隐藏光标 |
\033[?25h | 显示光标 |
23.判断一个命令是否存在
# 1. 使用which,据网络查找,有缺点:这是非shell内置命令,不同环境实现不同,使用$?判断可能失败
which wget
# 2. 使用command
command wget -h &> /dev/null
24.替换目录下所有文件中匹配的字符串
sed -iz 's/http:\/\/ajax.googleapis.com\/ajax\/libs\/angularjs\/1.0.8\/angular.min.js/https:\/\/cdn.bootcss.com\/angular.js\/1.0.8\/angular.min.js/' `find . -type f -print0`
25.tar.xz文件解压到指定目录
# x 从压缩文件提取文件
# v 显示正在处理的文件
# J 可以处理 xz,lzip,lzma,
# f 使用文件
tar xvJf cron-4.1-65.tar.xz -C /
26.crontab定时任务
# 分 时 日 月 周 命令
# [0-59] [0-23] [1-31] [1-12] [0-6]
* * * * * * date "+%Y-%m-%d %H:%M:%S"
27.tput 终端处理
28.Linux 录制和回放
# 开始录制
script -t 2>time.file -a output.file
...
# 结束录制
# 开始回放
scriptreplay time.file output.file
29.查看文件创建时间(Windows cygwin)
# linux不能查看,会输出-
stat -c %w tmp.sh
30.将文本文件每行逆序输出
rev file
31.find多文件 使用*要使用""包起来
32.获取脚本执行所在目录
$(cd `dirname $0`; pwd)
33.umask
umask
# 0022
# setUid/setGid/粘着位(sticky)、属主权限、组权限、其他用户的权限
# 通常用后三个
# 文件夹默认权限777,需要减掉022得到755
# 文件默认权限666,减掉022得到644
34.使用上条命令或参数
# 第一个参数
!:1
# 最后一个参数
!:$
# 上一条命令 不包括参数
!:0
# 或者
!#
!s以前用过的以s开头的命令,包括参数
!! 上一条命令,包括参数
35.计划任务
-
一次性任务
at now + 5 minutes 任务在5分钟后运行 at now + 1 hour 任务在1小时后运行 at now + 3 days 任务在3天后运行 at now + 2 weeks 任务在两周后运行 at midnight 任务在午夜运行 at 10:30pm 任务在晚上10点30分 at 23:59 12/31/2018 任务在2018年12月31号23点59分 echo "wget www.baidu.com" | at tomorrow atq # 查看at任务列表,等价于at -l atrm 1 # 删除at中id为1的任务,等价于at -d 1
-
长期性任务,见26
crontab -e # 添加 crontab -l # 查看
36.添加删除用户、组
useradd zhangsan
adduser zhangsan # 会在home目录下建立一个同名文件夹,等价于useradd -m
userdel zhangsan
deluser zhangsan
groupadd QQgroup
addgroup QQgroup
groupdel QQgroup
delgroup QQgroup
gpasswd -a zhangsan QQgroup
gpasswd -d zhangsan QQgroup
37.给特定用户或用户组添加权限
# 加R可以设置目录
# 设置文件的用户或用户组的ACL权限
setfacl -m u:用户名:权限 文件名
setfacl -m g:用户组名:权限 文件名
# 删除文件指定用户或用户组的ACL权限
setfacl -x u:用户名 文件名
setfacl -x g:组名 文件名
# 删除文件所有ACL权限
setfacl -b 文件名
# 查看ACL权限
getfacl 文件名
38.获取本机外网地址
curl ifconfig.me
39.修改ubuntu主机名
修改/etc/hostname文件,将/etc/hosts加入一条
127.0.0.1 [修改后的主机名]
不加的话会在重启后一直出现unable to resolve host,然后reboot
40.iptables 用法
参考链接 https://www.cnblogs.com/metoy/p/4320813.html
41.echo 获取帮助文档
/bin/echo --help
man echo
42.nc 命令
- 查看端口
- 聊天服务器
- 发送文件
43.tshark.exe在windows下使用
要先用管理员身份启动net start npf,接着就可以使用tshark了
44.将制表符转化为空格
expand -t 10 file
45.查看某一个进程的实时CPU利用率
top -p `ps aux | grep -w mysql | grep -v grep | awk '{print $2}'`
46.Shell开启调试
#!/bin/bash -x
47.Shell异常退出
set -e #开启后任意一条语句返回值不为真就退出
set +e #关闭
48.markdownpad2写行内公式
\\(a+b\\)
49.stty size
50.sort用法
- -u 去除重复行
- -r 降序
- -o 结果输出文件
- -n/-g 按数字排序
- -t 设置间隔符
- -k [ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
# 由逗号隔开,分为start和end两部分 # modifier是选项部分,如b忽略前导空白、d字典序、f忽略大小写、i忽略不可打印字符、n 或 r # FStart 表示第开始排序的field位置,FEnd 表示结束field位置 从1开始 # CStart 表示第开始排序的char位置,CEnd 表示结束char位置 sort -t ":" -k1.2n,1.2
51.命令行ctrl组合快捷键
# 清屏
clear
# 分别代表把管标移动到最前和最后
# echo -e '\00X' 或者 echo $'\00X' X是十进制数 ctrl+A echo -e '\001'
快捷键 | 效果 |
---|---|
ctrl+a | 光标移到行首 |
ctrl+b | 光标左移一个字母, 向行首移动一个字符 |
ctrl+c | 杀死当前进程 |
ctrl+d | 删除光标之后的一个字符 |
ctrl+e | 光标移到行尾 |
ctrl+f | 光标右移,向行尾移动一个字符 |
ctrl+g | 从逆向搜索模式退出 |
ctrl+h | 删除光标前一个字符,同 backspace 键相同 |
ctrl+i | 类似TAB健补全功能 |
ctrl+j | 回车,相当于enter |
ctrl+k | 删除光标所在位置之后的所有字符 |
ctrl+l | 清屏,相当于clear |
ctrl+m | 回车,相当于enter |
ctrl+n | 历史命令下一条命令,可用来查找 |
ctrl+o | 回车,相当于enter |
ctrl+p | 历史命令上一条命令,可用来查找 |
ctrl+q | 解锁屏幕,允许屏幕输出 |
ctrl+r | 进入逆向搜索模式,搜索之前执行的命令 |
ctrl+s | 锁定屏幕,阻止屏幕输出 |
ctrl+t | 交换光标位置前的两个字符 |
ctrl+u | 清除光标前至行首间的所有内容 |
ctrl+v | 插入特殊字符,如在命令行输入tab ctrl+v tab |
ctrl+w | 移除光标前的一个单词 |
ctrl+x | |
ctrl+y | 粘贴或者恢复上次的删除 |
ctrl+z | 把当前进程转到后台运行,使用fg命令恢复。比如top然后ctrl+z,到后台,然后fg,重新恢复 |
52.cp出现提示
使用-rf无效还是出现覆盖提示,原因是使用了alias, cp实际为cp -i
\cp -rf test/* test1/
53.添加用户进sudo组
vim /etc/sudoers
# 或
sudo visudo
# 文件最后一行添加,这种情况下需要用户输密码
robin ALL=(ALL) ALL
# 如果不需要用户输密码
robin ALL=(ALL) NOPASSWD:ALL
54.接收信号,自定义信号处理
trap "echo '接收到信号SIGINT CTRL+C'" SIGINT
count=1
while [ $count -le 10 ]
do
echo "循环 #$count"
sleep 1
((count++))
done
echo "结束"
55.复制一份文件n份
for((i=1;i<=16;i++)) do cp <文件名> <复制后文件名>$i; done
56.unzip解压强制覆盖
unzip -o file.zip
57.ssh远程登录
# 两台主机
# 服务器:10.110.50.110 root
# 客户机: 10.110.50.240 ubuntu
# 先在客户机使用ubuntu登录,调用ssh-keygen,一路回车,在/home/ubuntu/.ssh下生成公钥id_rsa.pub和私钥id_rsa
ssh-keygen
# 再把id_rsa.pub上传到服务器上,添加到/root/.ssh/authorized_keys文件中,然后可以删除这个id_rsa.pub
cat id_rsa.pub >> authorized_keys
# 最后在客户机/home/ubuntu/.ssh下,使用ssh -i id_rsa [email protected]就可以免密码登录服务端了
# 原理
# 当客户机向服务器发出建立安全连接的请求时,首先发送自己的public key,如果这个public key是被服务器所允许的,
# 服务器就发送一个经过public key加密的随机数据给客户机,这个数据只能通过private key解密,
# 客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道
58.shell公共函数与自定义函数库
# 公共函数库位置
/etc/init.d/functions
# 也可以自定义自己的函数库
# 然后在自己调用函数库的执行一下
. /etc/rc.d/init.d/functions
# 或者
. /path/to/my/function/lib
# 就能调用函数库脚本中的函数了
59.将大写文件名转成小写
find . | awk '{low=tolower($1);cmd="mv "$1" "low;system(cmd)}'
60.单文件gcc编译
假设源程序文件名为test.c。
-
无选项编译链接
用法:#gcc test.c
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。 -
选项 -o
用法:#gcc test.c -o test
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。 -
选项 -E
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。 -
选项 -S
用法:#gcc -S test.i
作用:将预处理输出文件test.i汇编成test.s文件。 -
选项 -c
用法:#gcc -c test.s
作用:将汇编输出文件test.s编译输出test.o文件。 -
无选项链接
用法:#gcc test.o -o test
作用:将编译输出文件test.o链接成最终可执行文件test。 -
选项-O
用法:#gcc -O1 test.c -o test
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长
61.恢复删除文件
- 参考博客
- df <目录名>
- 进入debugfs中执行open <df中file system>
- 执行ls -d /opt/fonsview/etc/ss
- 在显示结果中查找<>,找到删除的文件,记录之前的 <数字>
- 执行 logdump -i <数字>
- 在结果中找到Inode这一行,找到block 和offset 记录数字
- 退出debugfs,exit
- 执行 df if=文件系统 of=文件路径 bs=offset数字 count=1 skip=block数字
62.判断jar包是否损坏
unzip -t test.jar &> /dev/null
echo $?
63.字符串数组转命令
checkCammand="cat /sys/module/nf_conntrack/parameters/hashsize,\
cat /proc/sys/net/ipv4/tcp_tw_recycle,\
cat /etc/sysctl.conf |grep tcp_tw_recycle"
OLD_IFS=$IFS
IFS=","
checkCammandArray=($checkCammand)
IFS=$OLD_IFS
for((i=0;i<${#checkCammandArray[@]};i++))
do
eval ${checkCammandArray[i]}
done
64.斜杠替换,将\替换为/
path=Users\root\Desktop\Card-Upgrade\card-upgrade-src\card-upgrade-server\src\main\java\com\fiberhome\synergy\upgrade\entity
echo ${path//\\//}
65.删除每行前两个数字和制表符
sed -i 's/[0-9]\{2\}\t' num.txt
66.查看进程中线程CPU利用率
top -Hp <进程id>
67.进制转换
# 10进制转16进制
printf %x 789
echo "obase=16;ibase=10;789" | bc
# 16进制转10进制
printf %d 0x315
echo "obase=10;ibase=16;315" | bc
echo $((0x315))
echo $((16#315))
68.复制多个目录下avi视频文件到上层目录
cp */*.avi .
69.jstack生成文件查看线程状态种类及数量
grep java.lang.Thread.State 6780.txt | awk '{print $2$3$4$5}' |sort | uniq -c
awk '/java.lang.Thread.State/ {print $2$3$4$5}' app.txt | sort |uniq -c