Linux日常开发运维常用命令总结
- 作为后端开发人员,在日常开发、运维过程中经常需要在Linux系统中查看日志,这时候就需要会使用一些基本的Linux命令,对于日常工作很有必要(虽然目前容器化技术日益普及,可能并不一定需要直接操作Linux)。这篇文章专门对日常开发、维护经常用到的命令作一总结。
日志/文本查看命令
cat
:cat 文件名
tail
:tail -1000f 文件名
find
:查找命令。- 示例1:Linux中删除指定目录下中包含log的所有文件,排除bbbbb-2021-06-30-17.log这个文件,然后删除找到的文件
find /export/xxx/aaa/ -name '*log*'| grep -v bbbbb-2021-06-30-17.log |xargs sudo rm -rf
find /export/xxxx/ -name '*log*'| grep -v test-2021-06-26-11.log |grep -v /export/xxxx/logs |xargs sudo rm -rf
- 示例2:
- 输入:
find ./libs/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'
输出结果:kafka_2.12-1.0.0-javadoc.jar.asc
find dir -name
,就是在dir目录下根据名称去查找,这地方使用的是\ 也快是 “kafka_”,就是中间包含关键字的名称文件,然后管道之后是head -n
,就是显示查询结果的前n行,之后再管道,再grep -o
,就是 — 只输出匹配的具体字符串,匹配行中其他内容不会输出,比如没有这个grep -o
的结果如下:
find ./libs/ -name "*kafka_*" |head -3
./libs/kafka_2.12-1.0.0-javadoc.jar.asc
./libs/kafka_2.12-1.0.0-test-sources.jar.asc
./libs/kafka_2.12-1.0.0-test.jar
- 输入:
- 示例3:模糊搜索
find /usr/local/nginx/logs/access/host/ -name '*.access.log.log'|xargs rm -rf
- 模糊搜索/usr/local/nginx/logs/access/host/目录下文件名中包含access.log.log的所有文件:
find /usr/local/nginx/logs/access/host/ -name '*.access.log.log'
- 查找文件名中包含某字符(如"elm")的文件:
find /home/lijiajia/ -name '*elm*'
find /home/lijiajia/ -name 'elm*'
find /home/lijiajia/ -name '*elm'
- 示例4:正则表达式:注意:. 表示普通字符,并不是java正则表达式中的任意字符。
sudo find ./ -name "*.log.*" -type f | xargs sudo rm -rf
sudo find ./ -name "*.log" -type f | xargs sudo rm -rf
- 示例5:
find /tmp -name core -type f -print | xargs /bin/rm -f
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
find . -type f -exec file '{}' \;
find $HOME -mtime 0
find /usr/local/src/all2 -name aaa.txt -type f -print | xargs /bin/cat
:将find命令的搜索结果作为后面命令的输入
- 示例6:
find / -name docker.service -type f
- 示例1:Linux中删除指定目录下中包含log的所有文件,排除bbbbb-2021-06-30-17.log这个文件,然后删除找到的文件
- 其他查找命令:
locate命令
locate
命令其实是 “find -name
” 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb
),这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用locate
命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate
之前,先使用updatedb
命令,手动更新数据库。- locate命令的使用实例:
- 搜索etc目录下所有以sh开头的文件:
locate /etc/sh
- 搜索用户主目录下,所有以m开头的文件,并且忽略大小写:
locate -i ~/m
- 搜索etc目录下所有以sh开头的文件:
- 示例7:
- 查找指定目录下含有指定词的文件
find /export/mulu/ -name "*screen*.jar" -print
- 在/dir目录及其子目录下面查找名字为filename的文件
find /dir -name filename
- 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
find . -name "*.c"
- 在 etc 目录下,查找大写字母开头的 txt 文件
find /etc -name "[A-Z]*.txt" -print
- 在当前目录下查找不是 out 开头的 txt 文件
find . -name "out*" -prune -o -name "*.txt" -print
- 在当前目录除 git 子目录外查找 txt 文件
find . -path "./git" -prune -o -name "*.txt" -print
- 找出某个文件的所有硬链接,ls 命令 -i 选项可以查看文件的 inode 号
ls -i 1.txt # 138956 1.txt
find . -num 138956
- 搜索文件时使用
-iname
参数可以忽略文件名称大小写
- 查找指定目录下含有指定词的文件
文本编辑/替换命令
sed
:stream editor for filtering and transforming text
- 命令格式1:
sed 's/原字符串/新字符串/' 文件
- 命令格式2:
sed 's/原字符串/新字符串/g' 文件
这两种命令格式的区别在于是否有个“g”。没有“g”表示只替换第一个匹配到的字符串,有“g”表示替换所有能匹配到的字符串,“g”可以认为是“global”(全局的)的缩写,没有“全局的”结尾就不要替换全部,这样就好记啦
例如:sed 's/b/B/' testfile.txt
将testfile.txt中的第一个b替换为B;
sed -i 's/[0-9]/好的/g' testfile.txt
将testfile.txt中的所有数字替换为好的,会编辑原文件 - 替换某行内容
- 命令格式1:
sed '行号c 新字符串' 文件
- 命令格式2:
sed '起始行号,终止行号c 新字符串' 文件
- 命令格式1:
- 多条件替换:
- 命令格式:
sed -e 命令1 -e 命令2 -e 命令3
- 有些时候有多个替换条件,那就可以使用“-e”参数将这些替换条件连接起来,一次性完成所有的替换操作。例如,可以将上述的两种命令连接起来:“sed -e ‘s/原字符串/新字符串/’ ‘行号c 新字符串’ 文件”。如下图,不仅将小写“a”替换成了大写“A",还将第2行内容替换成了
“new test!”
。 - 例如:
sed -e 's/b/B/g' -e '3,4c this is new Test' testfile.txt
注意:这里的/
可以由@
替换
- 命令格式:
- 命令格式1:
whereis
命令whereis
命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b
)、man
说明文件(参数-m
)和源代码文件(参数-s
)。如果省略参数,则返回所有信息。whereis
命令的使用实例:
$ whereis grep
# grep: /bin/grep /xx/share/man/man1p/grep.1p.gz /xx/share/man/man1/grep.1.gz
which
命令which
命令的作用是,在PATH
变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which
命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。which
命令的使用实例:
$ which grep
# /xx/grep
文本搜索命令
grep
:应用示例:ls -l | grep '^a'
通过管道过滤ls -l输出的内容,只显示以a开头的行。grep 'test' d*
显示所有以d开头的文件中包含test的行。grep 'test' aa bb cc
显示在aa,bb,cc文件中匹配test的行。grep '[a-z]' aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。grep 'w(es)t.*' aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用""号进行转义,直接写成’w(es)t.'就可以了。grep -i pattern files
:不区分大小写地搜索。默认情况区分大小写grep -l pattern files
:只列出匹配的文件名,grep -L pattern files
:列出不匹配的文件名,grep -w pattern files
:只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’)grep -C number pattern files
:匹配的上下文分别显示[number]行,grep pattern1 | pattern2 files
:显示匹配 pattern1 或 pattern2 的行,grep pattern1 files | grep pattern2
:显示既匹配 pattern1 又匹配 pattern2 的行。- 分组:对模式进行分组
\(\)
- 引用:对分组的字符串基于位置引用
\1
: 后向引用,表示引用前面的第一个左括号与之对应的右括号中的模式所匹配到的内容\2
: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容
例如:testfile.txt文件内容为:
He like his lover
She love her liker
He loves his lover
She like his likergrep "\(l..e\).*\1r" testfile.txt
的输出内容为:
He loves his lover
She like his liker
输出结果中;前面显示like的后面显示liker
,前面显示love的后面显示lover
。
xargs命令
- 基本格式
xargs定位参数位置 | xargs控制参数位置 | 如何定位控制xargs参数位置
- 用法介绍:
管道 + xargs
用于把上游输出转换为下游参数输入。
例如ls *.bak | xargs rm -f
内存查看命令
top
:free
:free -h -s 2
-
第一列
Mem
内存的使用信息
Swap
交换空间的使用信息
第一行
total
系统总的可用物理内存大小
used
已被使用的物理内存大小
free
还有多少物理内存可用
shared
被共享使用的物理内存大小
buff/cache
被 buffer 和 cache 使用的物理内存大小
available
还可以被 应用程序 使用的物理内存大小 -
其中有两个概念需要注意:free 与 available 的区别
free
是真正尚未被使用的物理内存数量。available
是应用程序认为可用内存数量,available = free + buffer + cache
(注:只是大概的计算方法)
-
Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。
-
磁盘命令
- 查看磁盘空间占用情况
df -hT
- 查看当前目录下的文件及文件夹所占大小:
du -h --max-depth=1 ./*
进程管理命令
jps
:kill
:杀死当前指定进程,具体用法:kill -9 pid
kill -15 pid
kill
和kill -9
,两个命令都有杀死进程的效果,然而两命令的执行过程不同,在程序中如果用错了,可能会造成莫名其妙的现象。- 执行
kill
(不加 -* 默认kill -15
)命令,系统会发送一个SIGTERM
信号给对应的程序。当程序接收到该signal
信号后,将会发生以下事情:- 1)程序立刻停止;
- 2)当程序释放相应资源后再停止
- 3)程序可能仍然继续运行
- 执行
- 大部分程序接收到
SIGTERM
信号后,会先释放自己的资源,然后再停止。但是也有程序可能接收信号后,做一些其他的事情(如果程序正在等待IO,可能就不会立马做出响应,我在使用wkhtmltopdf转pdf的项目中遇到这现象),也就是说,SIGTERM
多半是会被阻塞的。 - 然而
kill -9
命令,系统给对应程序发送的信号是SIGKILL
,即exit
。exit
信号不会被系统阻塞,所以kill -9
能顺利杀掉进程。 - 小结:在使用
kill -9
前,应该先使用kill -15
,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。
- 查看端口号的占用情况
ss
:ss is used to dump **socket statistics**. It allows showing information similar to netstat. It can display more TCP and state informations than other tools.
- 示例:
ss -tnlp | grep ":22"
- 说明:
- 示例:
-n, --numeric
Do not try to resolve service names.
-l, --listening
Display only listening sockets (these are omitted by default).
-p, --processes
Show process using socket.
-t, --tcp
Display TCP sockets.
-u, --udp
Display UDP sockets.
netstat
:- 命令后可加参数
netstat [address_family_options] [--tcp|-t] [--udp|-u] [--udplite|-U] [--sctp|-S] [--raw|-w] [--listening|-l] [--all|-a] [--numeric|-n] [--numeric-hosts] [--numeric-ports] [--numeric-users] [--symbolic|-N] [--extend|-e[--extend|-e]] [--timers|-o] [--program|-p] [--verbose|-v] [--continuous|-c] [--wide|-W]
+ `netstat -tnlp | grep ssh`
+ `netstat -tnlp | grep ":22"`(此处22表示端口号)
lsof -i tcp:8286
fuser -v 8286/tcp
网络及端口命令
- 显示当前网络接口状态:
ifconfig
- 查看哪些端口在使用:
ps -ef
查看Linux内核版本信息
cat /proc/version
uname -a
uname -r
查看Linux用户信息
- 查询当前用户
id
- 查询指定用户
id 用户名
- 添加用户:
useradd psvmc
- 删除用户:
userdel psvmc
- 查看用户所在组:
- 查询当前用户的组内成员:
groups
解压缩:
- 1、
*.tar
用tar –xvf
解压
2、*.gz
用gzip -d
或者gunzip
解压
3、*.tar.gz
和*.tgz
用 tar –xzf
解压
4、*.bz2
用bzip2 -d
或者用bunzip2
解压
5、*.tar.bz2
用tar –xjf
解压
6、*.Z
用uncompress
解压
7、*.tar.Z
用tar –xZf
解压
8、*.rar
用unrar e
解压
9、*.zip
用unzip
解压 - 示例:
tar -tf all.tar
这条命令是列出all.tar包中所有文件,-t是列出文件的意思tar -xf all.tar
这条命令是解出all.tar包中所有文件,-t是解开的意思- 压缩:
1)tar –cvf jpg.tar *.jpg
//将目录里所有jpg文件打包成tar.jpg
2)tar –czf jpg.tar.gz *.jpg
//将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip
压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
3)tar –cjf jpg.tar.bz2 *.jpg
//将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2
压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
4)tar –cZf jpg.tar.Z *.jpg
//将目录里所有jpg文件打包成jpg.tar后,并且将其用compress
压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
-Z, --compress, --uncompress
,filter the archive through compress
tar
命令详解-c
: 建立压缩档案:create,create a new archive-x
:解压:extract/get:extract files from an archive-t
:查看内容:list,list the contents of an archive-r
:向压缩归档文件末尾追加文件:append,append files to the end of an archive-u
:更新原压缩包中的文件:update,only append files newer than copy in archive
这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。-f
: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。:file-v
: verbose, verbosely list files processed-z
:gzip,filter the archive through gzip
tar -cf all.tar *.jpg
这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
tar -rf all.tar *.gif
这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -uf all.tar logo.gif
这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
Linux中sh -c用法整理
-
在Linux使用
echo
并配合命令重定向是实现向文件中写入信息的快捷方式。 -
比如要向
test.asc
文件中随便写入点内容,可以:
$ echo "信息" > test.asc 或者 $ echo "信息" >> test.asc
- 下面,如果将
test.asc
权限设置为只有 root 用户才有权限进行写操作:
$ sudo chown root.root test.asc
- 然后,我们使用
sudo
并配合echo
命令再次向修改权限之后的test.asc
文件中写入信息:
$ sudo echo "又一行信息" >> test.asc
-bash: test.asc: Permission denied
- 这时,可以看到
bash
拒绝这么做,说是权限不够。这是因为重定向符号 “>” 和 “>>
” 也是bash
的命令。我们使用sudo
只是让echo
命令具有了 root 权限,但是没有让 “>
” 和 “>>
” 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像test.asc
文件写入信息的权限。
解决这一问题的途径有两种。第一种是利用 “sh -c
” 命令,它可以让bash
将一个字串作为完整的命令来执行,这样就可以将sudo
的影响范围扩展到整条命令。具体用法如下:
$ sudo sh -c 'echo "又一行信息" >> test.asc'
- 另一种方法是利用管道和
tee
命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:
$ echo "第三条信息" | sudo tee -a test.asc
- 注意,
tee
命令的 “-a
” 选项的作用等同于 “>>
” 命令,如果去除该选项,那么tee
命令的作用就等同于 “>
” 命令。
Linux下操作MySQL
- Linux下导入导出
MySQL
数据库表结构数据- 导出完整数据:表结构+数据
mysqldump -hIP -Pport -u数据库用户名 -pdatabasePass databaseName> dump.sql
- 导出数据库表结构:增加一个’-d’参数,忽略数据,只导出结构。
mysqldump -h localhost -u数据库用户名 -pXXXXX -d database > dump.sql
- 导出单个数据表结构和数据
mysqldump -h localhost -u数据库用户名 -pXXXXX database table > dump.sql
- 导出单个数据表结构(不包含数据)
mysqldump -h localhost -u数据库用户名 -pXXXXX -d database table > dump.sql
- 导出完整数据:表结构+数据