0.mtime
find path -mtime 1 -exec rm -f {} \; #查找过去一天的内容进行删除

1. more或者less如何显示颜色
grep text *.text --color=always | less -R
2. man命令使用
- 查找命令的使用手册
man grep
- 查找相关的命令
man -k grep
3. 链接文件
- 符号链接
ln -s src desc
# 得到的两个文件是完全不一样的,内容并不相同,可以通过文件的inode编号区别。
- 硬链接
ln src desc
# 得到的两个文件是完全一样的,当修改其中一个文件时,另一个文件也会被修改;同时需要注意的是链接计数显示这两个文件都有2个链接。
4. 查看文件或者目录的inode
文件或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。
ls -i a.txt
5.文件相关
5.1 查看文件类型
file 1.txt
5.2 对搜索到的文件执行命令
find -exec
# find -type f -name '*.log.*' -exec rm -f {} \; 对'*.log.*'类型的文件进行删除
{} 符号代表找到的文件, 并用\对分号(;)进行转义以作为命令的结束
5.3 将搜索结果打印文件
find -fprint
# find -type f -name '*.log.*' -fprint a.txt 将结果输出到文件
6. 进程管理
- 查看系统上运行的所有进程
ps -ef
==out C: cpu利用率 STIME:进程启动时的系统时间 TIME:运行进程需要的累计CPU时间 CMD: 启动程序的名称
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2019 ? 02:18:39 /usr/lib/systemd/systemd --system --deserialize 18
root 2 0 0 2019 ? 00:00:10 [kthreadd]
- 长格式输出
ps -efl
===out F: 内核分配给进程的系统标记 S: 进程的状态(O:正在运行;S:休眠;R:可运行,正等待运行;Z:僵化,进程已结束,但父进程不存在;T: 停止) PRI: 进程的优先级,数字越大,优先级越低。
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 S root 2 0 0 80 0 - 0 kthrea 2019 ? 00:00:10 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 2019 ? 00:33:11 [ksoftirqd/0]
- 实时显示进程信息
top
==out 第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载load average(近1min,5min,15min)。
top - 18:00:53 up 609 days, 6:35, 5 users, load average: 0.11, 0.42, 0.32
Tasks: 338 total, 1 running, 337 sleeping, 0 stopped, 0 zombie #进程概要
%Cpu(s): 1.9 us, 1.0 sy, 0.0 ni, 97.0 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st #CPU概要
KiB Mem : 8008856 total, 275988 free, 6336084 used, 1396784 buff/cache # 系统内存状态
KiB Swap: 0 total, 0 free, 0 used. 1165124 avail Mem
#按照%CPU值对进程排序, q键退出top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22710 root 20 0 114656 62616 2152 S 3.7 0.8 3493:31 hids_agent
8049 root 2 -18 2118076 85192 57200 S 1.7 1.1 8566:37 service_mesh_ma
- 进程信号
在Linux中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别 它并决定忽略还是作出反应。
- 查看Linux进程信号
kill -l
===out
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
2) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
1) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
2) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
3) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
4) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
5) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
6) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
7) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
8) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
9) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
10) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
11) SIGRTMAX-1 64) SIGRTMAX
- 发送进程信号
kill 进程pid #默认发送TERM信号,告诉进程尽可能停止运行
kill -s signal pid #kill -s KILL 19331 强制进程根据信号做出反应
kill -signal pid # kil -9 19331
killall http* #结束所有以http开头的进程
7. 磁盘管理
- 查看磁盘的使用情况
df -h
==out
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 9.6G 38G 21% /
devtmpfs 3.9G 0 3.9G 0% /dev
- 查看系统挂载设备列表
mount
==out
sysfs on /sys type sysfs (rw,relatime)
proc on /proc type proc (rw,relatime)
- 查看某一特定目录的磁盘使用情况
du -h --max-depth=1
# -c:显示所有已列出文件总的大小
-s:显示每个输出参数的总计
-h:按用户易读的格式输出大小
--max-depth : 指定统计的目录深度
8. 后台命令
- 查看当前运行在后台模式的进程
jobs -l
fg n #将后台进程调回前台执行或者前台模式重启停止的任务
bg n #将前台程序调到后台执行或者后台模式重启停止的任务
- 将程序后台执行
python a.py & #& 表示后台执行
- 查找命令位置
which mysql
type mysql
whereis hosts #查找文件位置
9.环境变量
- 全局环境变量
env或printenv #查看所有全局环境变量
printenv HOME #查看个别环境变量的值
- 局部环境变量
set #显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量、用户自定义变量
- 设置全局环境变量
GO111MODULE=on
export GO111MODULE
#修改子shell中全局环境变量并不会影响到父shell中该变量的值;子shell甚至使用export命令也无法改变父shell中全局环境变量的值。
- 删除环境变量
unset GO111MODULE
#如果在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用。
如果要用到变量,使用$。如果要操作变量,不使用$。这条规则的一个例外就是使用printenv显示某个变量的值。
- 环境变量持久化
在命令行定义的环境变量并不是持久的,会随着shell的退出而失效。可以把个人自定义环境变量放在用户目录下的.bash_profile文件中。执行source .bash_profile 使其生效。
10. 使用变量
shell脚本中最有用的特性就是从命令输出中提取信息,并赋值给变量。有两种方法可以将命令输出赋给变量,然后就可以在脚本中随意使用了。
1. `` # `date`
2. $() # $(date)
#!/bin/zsh
a=`date +%Y.%m.%d`
b=`date +%A`
echo "今天是$a号星期$b"
echo $(dirname $0)
11. 重定向输入输出
输出重定向>,输入重定向<,输出数据追加>>,内联输入重定向<<
# 按照既有格式输出cat数据
cat << EOF
你和
ad
123
EOF
#必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
12. 数学运算
1. expr 1 + 5
2. a=$[1 + 5];echo $a
3. decimal=$(echo "scale=2;3*1.8"|bc);echo $decimal #浮点运算 ,使用bc计算器,scale表示保留到小数点位
13. 特殊参数变量
变量 | 含义 |
$# | 命令行参数的个数 |
${!#} | 命令行参数的最后一个值 |
$* | 保存所有命令行参数(作为整体) |
$@ | 保存所有命令行参数(作为每一个个体) |
$? | 函数的退出状态码,成功执行的命令状态码为0,未成功的为一个正数值 |
本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile、.bashrc文件中
全局变量:所有用户都可以使用,保存在/etc/profile、/etc/bashrc文件中
用户自定义变量:用户自定义,比如脚本中的变量
14. 结构化命令
- if-then语句
if command #如果command退出状态码为0,则执行then下的命令,否则不执行then下的命令
then
commands
fi
===================
if command;then
commands
fi
==== 高级特性
1. 用于数学表达式的双括号(( expersion ))
if [ -1 -eq 2 ];then
echo 'True'
else
if (( 1*5>1 ));then
echo '1*5>10'
fi
echo 'False'
fi
2. 用于高级字符串处理的双方括号 [[ expersion ]]
- if-then-else语句
if command
then
commands
else
commands
fi
================
if command
then
commands
elif command
then
commands
fi
- test测试命令
if test condition
then
commands
fi
============
if [ condition ] #注意方括号的空格。 复合测试条件 [ condition1 ] && [ condition2 ]
then
commands
fi
- case命令
read num
case $num in
1)
echo '你输入了1'
exit $?
;; #命令结束标记
2)
echo '你输入了2'
;;
3|4)
echo '你输入了3或者4'
;;
*)
echo '请重新输入'
;;
esac
- for命令
rray=(1 2 3 4 5 6)
for var in ${array[@]};do
echo $var
done
===c语言风格的for命令
for (( a=0;a<10;a++ ));do
echo $a
done>$(cd $(dirname $0); pwd)/04.txt #输出到文件,不打印到控制台
- while命令
a=1
while (( $a<4 ));do
echo $a
# a=a+1 报错
let "a++" #a=$[ $a+1 ]
done
=== until 命令和while命令的工作方式完全相反,until指定当测试命令的退出状态码不为0,才会执行循环中列出的命令,当退出状态码为0,就结束循环。
- 控制循环
break #跳出内部一层循环
break n #n指定了要跳出的循环层级
continue #提前终止某次循环
15. 处理用户输入
- 获取不包含路径的脚本名
name=$(basename $0);echo $name
- 移动变量
shift #在使用shift命令时,默认情况下它会将每个参数变量向左移动一个位置。所以,变量$3的值会移到$2中,变量$2的值会移到$1中,而变量$1的值则会被删除(注意,变量$0的值,也 就是程序名,不会改变)。
shift n #给shift命令提供一个参数,指明要移动的位置数就行了。
#06.sh
count=1
while [ $# -ne 0 ]; do
echo "paramter #$count = $1"
count=$[ $count + 1 ]
shift
done
===out
sh 06.sh 1 2 3 4
paramter #1 = 1
paramter #2 = 2
paramter #3 = 3
paramter #4 = 4
- 获取用户输入
read name #从键盘或文件描述符读取数据,放进变量name
echo -n "请输入数据:" #-n 不换行
read name
echo "hello $name"
# ===== 通过read指定提示符
read -p "请输入数据:" name
echo "hello read $name"
# ==== 接收多个变量
read -p "请输入数据:" name age
echo "hello read $name, $age"
# ==== 不指定接收值,read接收的数据放在特殊变量REPLY中
read -p "请输入数据:"
echo "hello read $REPLY"
16. 文件描述符
文件描述符 | 缩写 | 描述 |
0 | STDIN | 标准输入 |
1 | STDOUT | 标准输出 |
2 | STDERR | 标准错误 |
- 只重定向错误
ls -al badfile 2> test4 #将该文 件描述符值放在重定向符号前。该值必须紧紧地放在重定向符号前,否则不会工作
- 重定向错误和数据
ls -al test test2 test3 badtest 2> test6 1> test7 #如果想重定向错误和正常输出,必须用两个重定向符号,分别输出到不同的文件
ls -al test test2 test3 badtest &> test7 # &> 将STDERR和STDOUT的输出重定向到同一个输出文件
17. 控制脚本
- 后台模式运行脚本
./test1.sh & #如果终端退出,后台进程也会随之推出
- 非控制台下运行脚本
nohup ./test1.sh & #nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会话时阻止进程退出
18. 函数
- 局部变量与全局变量
# 默认情况下,在脚本中定义的任何变量都是全局变量
function func1 () { #变量在函数内部被赋给了新值,那么在脚本中引用该变量时,新值依然有效
temp=$[ $value +5 ]
# local temp=$[ $value +5 ] 局部变量保证了变量只局限于函数中,只在函数内部有效
result=$[ $temp*2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi
- 脚本作为库使用
#使用 . 号来引用01.sh 文件,注意点号(.)和文件名中间有一空格。source 的别名,点操作符
. ./01.sh
#使用source来引用文件
source ./01.sh
function func1(){
echo '第一个shell函数'
}
func1
19. sed流编辑器
- 命令行使用编辑器命令
echo "this is a test" | sed "s/test/big test/g" #this is a big test
sed编辑器并不会修改文本文件的数据,它只会将修改后的数据发送到STDOUT,原始数据并不会被修改。
命令基本格式:sed options script file
- 命令行使用多个编辑器命令
sed -e 's/brown/green/; s/dog/cat/' data1.txt #将brown替换为green,dog替换为cat。命令之间用分号隔开,且命令末尾和分号之间不能有空格
- 从文件中读取编辑器命令
#script.sed
s/brown/green/
s/fox/elephant/
s/dog/cat/
=====
sed -f script.sed data1.txt
20. awk程序
akw和gawk是一样的,在Linux中awk链接指向gawk,awk程序让流编辑器上了一个新台阶,它提供了一种编程语言而不是编辑器命令。awk的强大之处在于脚本,可以写脚本来读取文本行的数据,然后处理并显示数据,创建任何类型的输出报告。
默认情况下,awk会从输入中读取一行文本,然后针对该行的数据执行程序脚本。
命令的基本格式:awk options program file
- 从命令行读取脚本
awk '{print 123}' #awk脚本用{}来定义,若脚本是单个文本字符串,需要加单引号
- 使用数据字段变量
#data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.
====== $0代表整个文本行,$1代表文本行的第一个数据字段,以此类推。默认字段分隔符为空格
awk '{print $1}' data2.txt
One
Two
Three
- 指定字段分隔符
awk -F: '{print $1}' /etc/passwd #:作为分隔符
- 在程序脚本中使用多个命令
echo "My name is Rich" | awk '{$4="Christine"; print $0}' #命令之间使用分号分割
===out==
My name is Christine
- 从文件中读取awk程序
#script.awk
{print $1 "'s home directory is " $6}
===use===
awk -F: -f script.awk /etc/passwd
- 关键字BEGIN和END
1. 数据处理前执行脚本
awk 'BEGIN {print "Hello World!"}' #在显示了文本后,它会快速退出,不等待任何数据
2. 在执行了BEGIN脚本后,第二段脚本用来处理数据
awk 'BEGIN {print "Hello World!"} {print 123}'
3. 数据处理后运行脚本(分别定义了三个脚本)
awk 'BEGIN {print "Hello World!"} {print 123} END{print "end"}'
21. xargs命令
xargs命令的作用是将标准输入或者管道数据转为命令行参数。它能够捕获一个命令的输出,然后传递给另外一个命令。
- 管道传参
echo "one two three" | xargs mkdir #等价于mkdir one two three xargs将换行符和空格作为分隔符
echo -e "a\tb\tc" | xargs -d "\t" echo # a b c xargs将换行符和空格作为分隔符,-d参数可以更改分隔符
- 单独使用
xargs #等价于 xargs echo
- grep命令
- 筛选数据,并去重
#uniq 检查重复出现的列,sort 进行排序
grep Trace rpc_server_59*.log | awk -F 'input' '{print $2}'| awk '{print $1}'|sort|uniq -c| sort -n
22. Vim技巧
- 批量注释和取消注释
#多行注释
:起始行号,结束行号s/^/注释符/g #:121,129s/^/#/g
#取消注释
:起始行号,结束行号s/^注释符//g
- 光标快速移动到最后一行
G
- 光标移动n行
nG
- 光标移动到第一行
gg
- 删除光标所在行
dd #ndd 删除向下n行
- 复原前一个动作
u
参考
- Linux命令行与shell脚本编程大全(3rd)
- shell教程|runoob
- 高级Bash脚本编程指南