【Linux】 shell 学习汇总[转载]
转载地址:https://blog.csdn.net/baidu_33718858/article/details/81453835
一些平时使用过程中的知识点积累,来源都附上了博客,添加了一些自己的总结。
感触:linux命令用熟了相当提高工作效率,有时候用Python写十几行代码,Linux一行命令搞定~
1.Linux下的date命令
Linux下date命令,格式化输出,时间设置_debian 设置date默认输出格式-CSDN博客
2.Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
http://blog.51cto.com/dadekey/119938
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
3.basename命令
http://man.linuxde.net/basename
basename只会显示文件名,不会带上目录。
4.ps -ef 和 ps aux的区别
Linux下ps -ef和ps aux的区别及格式详解 - 520_1351 - 博客园
输出格式不同,都是用来查看进程。
5.awk 命令详解
[转]linux awk命令详解 - 旭东的博客 - 博客园
Awk使用案例总结(运维必会)_51CTO博客_awk使用方法
$ awk '!a[$0]++' file 删除重复行
awk在文件中插入一列数据。
使用awk或者sed命令在文件中插入列_FlyintheWind_新浪博客
NR表示现在读的行数,NF表示列数
awk只输出偶数行 awk '!(NR%2)' file1 > file2
awk只输出奇数行 awk 'NR%2' file1 > file2
6.source 命令,以及与./, sh 的区别
linux里source、sh、bash、./有什么区别 - pcat - 博客园
7.if命令中-a到-z的意思
shell下if命令中-a~-z意思_shell -a -lt-CSDN博客
[-s FILE] 存在且大小不为0
[-f FILE] 存在且是一个普通文件
[-z STRING ] “STRING” 的长度为零则为真。
8.crontab定时任务
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
Linux crontab命令小结-CSDN博客
crontab -l 可以查看参数
linux之crontab定时执行命令走过的坑坑-CSDN博客 (总结了一些crontab下运行不正常的情况)
9.vim的一些命令
不显示行号: :set nonu
显示行号::set nu
粘贴不会乱格式::set paste, 然后按i进入编辑模式,再粘贴
vim中如何全选: ggVG 可以全部选中。
来自 vim实现全选功能_gvim批量选中-CSDN博客
gg 让光标移到首行,在vim才有效,vi中无效
V 是进入Visual(可视)模式
G 光标移到最后一行
选中内容以后就可以其他的操作了,比如:
d 删除选中内容
y 复制选中内容到0号寄存器
"+y 复制选中内容到+寄存器,也就是系统的剪贴板,供其他程序用
10.wget命令和其一些参数
每天一个linux命令(61):wget命令 - peida - 博客园
wget ftp://xxx -O filename 表示将get下来的文件输出到filename中。
11.sleep 休眠
Linux sleep命令 | 菜鸟教程
12.vim 的一些快捷键,这些都要记住,真的是非常常用了!
Vim快捷键分类 - 豪情 - 博客园
0: 跳转到行首。
$: 跳转到行尾。
:g/\[/s// 全局替换
13.shell中循环遍历字符串数组,感觉shell的语法确实很奇特呀
shell script循环遍历字符串数组_shell 遍历字符串-CSDN博客 (试了第一种方法,有效,感觉比较方便)
数组中的值不可以用逗号分隔!!!
自己的代码,需要判断指定文件中是否包含要检测的字符串:
14. shell中的引号,尤其注意双引号和反引号。
Linux Shell之echo,变量_shell echo 变量-CSDN博客
15.sed从某行开始读到文件尾。
sed -n '674393, $p' file1 > file2
$p 表示到文件尾。
16.tail命令,
从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.
每天一个linux命令(15):tail 命令 - peida - 博客园 (这个博客蛮好的,每天都会推送一个linux命令)
17.查找某个文件夹下包含给定字符串的某一文件,一般用来扫代码。
find . | xargs grep -ri "给定字符串" -l
-l 表示只打印出文件名
linux查找目录下的所有文件中是否含有某个字符串_linux查询不包含数字-CSDN博客 (这个博客里面讲了正则、find、xargs、以及grep的一些知识点)
xargs主要是为了防止参数过长溢出。
find . -name '*.py' | xargs grep 'xxx' -l
查询此目录下的所有.py文件中包含'xxx'的文件名。
find的各种参数:
xargs的作用和一些参数:
Linux基础:xargs命令 - 程序猿小卡 - 博客园 (xargs的命令详解)
在linux上批量删除空文件
http://www.111cn.net/sys/linux/46433.htm (这篇博客讲了删除文件的很多情景下的命令)
find -type f -size 0c | xargs -t rm -f
-t是为了将命令打印出来看
find -type f -size 0c | xargs -t -n2 rm -f
可以用-nx(x为参数的最大数量)对参数进行分组,比如上述例子最大参数为2,防止查找出来的文件数量太多,导致的错误。
不加-n默认参数为传进来的所有文件。
18.查看某文件的修改时间
在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间_文件访问时间和修改时间是一样的吗-CSDN博客 (此博客讲了好几个查看的方法,亲测有效)
通过stat filename.txt来查
19.linux下执行某个脚本,希望打印异常信息在屏幕上,而不是log中。可以使用 sh -x filename。
执行命令的一些参数:
-n 只读取shell脚本,但不实际执行
-x 进入跟踪方式,显示所执行的每一条命令
-c "string" 从strings中读取命令
“-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。
“-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示:
sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'
"-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。
来自 IBM Developer (讲得蛮好的)
20.touch命令可以创建新文件
touch fileA,如果fileA存在,使用touch命令可更改这个文件或目录的日期时间,包括存取时间和更改时间;如果fileA不存在,touch命令会在当前目录下新建一个空白文件fileA。
学习Linux二(创建、删除文件和文件夹命令) - 飝兒 - 博客园 (这个博客记录了一下linux的常用命令以及参数解析)
21.查看一个文件的前15行的第一列
head -15 文件名 | awk '{print$1}'
head命令可以打印出了最后M行以外的所有的行
head -n -5 file 打印出了最后5行以外的所有行。
head -n 5 file 打印第1-5行。
awk,sed,grep 常记心中。
复制中file1的1-50行放到file2中。
sed -n '1,50 p' file1 > file2
将文本中的两行变成一行。用sed和awk实现将文本中的上下两行合并为一行_sed 多个空行合并成一个-CSDN博客
22. wc 命令详解
每天一个linux命令(40):wc命令 - peida - 博客园
非常常用的命令啦~ 意思是word count
23.grep命令详解
这个也是很基本的一个命令了,要对grep非常敏感,了解他的各项参数,可以完成各种针对文件内容的查询。
配合find使用,可以批量对文件进行grep操作,扫代码的时候非常管用。
每天一个linux命令(39):grep 命令 - peida - 博客园
我认为比较常用的一些参数:(来自《linux shell 脚本攻略》这本书)
grep word filename --color=auto (可以高亮找到的内容)
egrep "[a-z]+" filename 等价于 grep -E "[a-z]+" filename (正则匹配)
grep -v match_pattern file (打印除包含match pattern 之外的所有行, -v可以将匹配到的结果进行反转)
grep -c word file (打印出来匹配行的数量)
grep -n word file (显示行号)
-A<显示行数> --after-context=<显示行数> #除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-B<显示行数> --before-context=<显示行数> #除了显示符合样式的那一行之外,并显示该行之前的内容。
还有查找进程的时候,也常用grep
24. seq命令用于产生从某个数到另外一个数之间的所有整数。
http://man.linuxde.net/seq
25. iconv 用来转换文件的编码方式
iconv命令详解 - leezhxing - 博客园
26. linux中的&,&&,|,||, >, &>介绍
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server & (后台执行,常用哦,代码后台跑着,就可以收拾书包回家了,之后可以用ps -ef|grep xx 查询进程)
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2' (常用哦,在写脚本,或者添加到crontab中时常用)
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l (常用哦)
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail" (暂时还没用到)
>只能将正常信息重定向(非常常用)
&>可以将错误信息或者普通信息都重定向输出。(没有用过)
27. sort 命令,可针对文本文件的内容,以行为单位来排序。
linux sort 命令详解(看完你就会sort用法了)_Lisp的运维之路的技术博客_51CTO博客
sort的-u, 在输出行中去除重复行。
sort提供了-t选项,后面可以设定间隔符。-k来指定列数。
sort -r 降序排列
sort -o 输出到指定文件
由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。
但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。使用-o完美解决。
sort -n 按照数值来排序
sort -bd txt -b 可以忽略文件中的前导空白行,-d用于指明以字典序进行排序。
如果要使用uniq,必须先对文件进行sort排序。
uniq -u sorted.txt 只显示在文件中唯一的行。
uniq -c 统计各行在文件中出现的次数。
uniq -d 找出文件中重复的行。
28.linux 下如何将个服务器上的文件或者文件夹复制到另一台服务器上
scp命令 scp 文件名 用户名@计算机IP或者计算机名称:远程路径
linux 将一个服务器上的文件或者文件夹复制到另一台服务器上_linux从一个服务器复制文件到另一个服务器显示无路由-CSDN博客
29.在awk中,比较数字的大小时,其实是拿字符串在比较,解决方法如下:
awk '{if($3+0>0.5+0||$4+0>0.5+0) printf $1"\t"$3"\t"$4"\n"}' result.txt 记得要在0.5后面也加上0。
统一某一列出现某个值的个数。
awk ‘BEGIN{num_1=0}{if($2==1) num_1 +=1}END{print “the num of flag1=”, num_1}’ result.txt
30.看到的一个删除大文件前n行的命令
tail -n +3 old_file > new_file
来源在这里:linux删除大文件的前n行_linux大文件 去掉前两行-CSDN博客
tail 命令打印除前M行之外所有的行
tail -n +(M+1) file
31.求文本文件的交集和差集,使用comm命令。
comm必须使用排过序的文件作为输入。记得排序!!!
comm A B 不加任何参数输出的第一列为只在A中出现的行,第二列为只在B中出现的行,第三列为A和B中相同的行,\t为定界符。
只打印两个文件的交集,删除第一列和第二列,comm A B -12
打印出两个文件中不同的行,并删除输出的空白, comm A B -3 | sed 's/^\t//'
想得到在A中有,B中没有的行,comm A B -23
想得到在B中有,A中没有的行,comm A B -13
32.最常用的ls命令
每天一个linux命令(1):ls命令 - peida - 博客园 (每天一个linux命令,这个博主好厉害,坚持~)
ls不仅可以查看linux文件夹包含的文件,而且可以查看文件权限(包括目录、文件夹、文件权限),查看目录信息等等。
常用参数,可以配合使用:
33. cut命令将文件进行切分。
linux之cut用法 - 东方雨中漫步者 - 博客园 (蛮详细的)
-f 表示是按照字段(files),也就是列进行切分。
cut -f 2,3 filename 显示文件的2,3列
cut -f3 --complement filename 显示文件除第3列以外的所有列。
cut -f3-5 -d ";" filename 显示文件第三至五列,-d用来指定分隔符。
还可以选择下面两个参数。
字节(bytes),用选项-b
字符(characters),用选项-c
34、光标移动行头行尾
CTL+A 移动行头 CTR+E行尾
35、查看进程侦听的端口和PID 名称
查看进程和侦听端口
netstat -tunlp
36、http访问命令
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
curl -I https://xxx.com
curl https://xxx.com -k 忽略证书问题
wget http://www.xxx.com 访问这个地址
37. sed替换文本
sed 's/10.99.204.138/47.109.77.22:444\/base/g' dashboardv2.7.0.yaml > dashboardv2.7.0- new.yaml
把dashboardv2.7.0.yaml 文件中的10.99.204.138 全部替换 47.109.77.22:444/base 生成一个新文件dashboardv2.7.0- new.yaml
38. 查看容器里面的iptables信息
nsenter --target <container_pid> --net -- iptables -L -v -n