linux常用三大指令:grep、sed、awk

grep:过滤内容 sed:替换 awk:截取

linux 常用命令

grep

  1. # 过滤以 abc 结尾的文件
  2. ls | grep "abc$"
  3. # 过滤以 abc 开头的文件
  4. ls | grep "^abc"
  5. # 过滤注释行、行首空格
  6. egrep -v "^\s*#|^\s*$" demo.txt
  7. # 排除多个条件(或)
  8. egrep -v "条件1|条件2|条件3" demo.txt
  9. # .tar.gz 文件过滤字符
  10. zgrep "条件" info.log.tar.gz
  11. # 忽略大小写查找
  12. grep -i abc system.log
  13. # 常用查找 Java 进程的命令
  14. ps -ef | grep java | grep -v grep


根据端口查找对应的 PID

lsof -i:端口

netstat -ntlp | grep -w 端口常用 Linux 命令 - 图1
说明该服务已经启动,对应的 PID 是 209647
若查询结果为
常用 Linux 命令 - 图2
则说明,该端口对应的服务未启动

由 PID 查询对应服务的路径

pwdx PID端口
eg. pwdx 209647
常用 Linux 命令 - 图3
可以看出,服务所在路径为
/ICC/dahua/fire/FireAppServer

进阶:

  • 端口 —> 服务对应的路径

eg.根据服务端口 60080 查询对应的服务所在的路径
pwdxlsof -i:60080 | sed -n ‘2p’ | cut -d ‘ ‘ -f5| awk -F": " '{print $2}'
常用 Linux 命令 - 图4

其中: sed -n ‘2p’:展示第二行 cut -d ‘ ‘ -f5:使用"空格"进行数据的截取,并取第5个值 awk -F": " '{print $2}':使用"冒号"进行分割,并取第二个 pwdxlsof -i:60080 | sed -n ‘2p’ | cut -d ‘ ‘ -f5| awk -F": " '{print $2}...是将第一次的查询结果作为 pwdx 查询的基础。

  • 端口 —> PID + 服务对应的路径(★★)

路径(分行展示)
pwdxlsof -i:60080 | sed -n ‘2p’ | cut -d ‘ ‘ -f5| sed 's/: /&\n/g' | sed 's/://g'
常用 Linux 命令 - 图5

  • 端口 —> pid + 服务对应的路径(★☆)

pwdx lsof -i:60080 | sed -n '2p' | cut -d ' ' -f5
常用 Linux 命令 - 图6

  • 根据端口杀死服务

eg. 根据端口 8080 杀死对应的服务
kill -9 $(netstat -nlp | grep :8080 | awk '{print $7}' | awk -F"/" '{ print $1 }')

返回上一次访问目录

cd -

查看系统中文件使用情况

df -h

查看各个文件占用空间大小(当前目录下)

du -sh *

查找文件

find /home -name "*.txt" # 查找在 "/home" 路径下,名字为 ".txt" 后缀的文件
find / -name "abc.*" # 查找在"/"路径下,名字为 "abc" 开头的文件

清空日志

echo '' > ./logs/catalina.out #强制将 catalina.out 日志置为零

追加日志

echo '追加日志' >> ./logs/catalina.out #强制将 catalina.out 日志置为零

语句执行错误输出日志到文件

eg. sh -x upgrade.sh >> run.log 2>&1

测试 ip 是否畅通

telnet ip地址

动态显示文件内容(查看日志必备)

tail -f 文件名
eg. tail -f catalina.out

打 .gz 包

tar -zcvf 要打包成的文件夹名.tar.gz a.txt bDir c.jgp

解压缩 .tar 包

tar -zxvf tomcat.tar.gz

复制文件(除了某文件)

  1. # 复制当前文件夹下的所有内容,除了 abc
  2. cp `ls |grep -v abc | xargs` /home/duni/copy_test


scp复制文件到服务器

  1. # 复制远端文件到本服务器
  2. scp [-P 远端服务器端口] -r 远端服务器IP:远端文件路径 本地保存路径
  3. # 复制本服务器文件到远端服务器
  4. scp -r 本地文件路径 远端服务器IP:远端文件路径

启动 springboot 服务命令

nohup java -jar AppServer.jar & tail -f nohup.out

方式2:不打印 nohup.out 日志
nohup java -jar AppServer.jar > /dev/null 2>&1 &

启动 springboot 远程 debug 调试模式

java -jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=50584 AppServer.jar &

  • 普通项目启动(传统 java 项目,非 SpringBoot 项目)

进入 bin 目录,执行该命令
./startup.sh

  • 普通项目远程 debug

① bin目录下找到并打开 catalina.sh,查找 “JPDAADDRESS=”(方法:”:/JPDA_ADDRESS_”,然后按 “N”,向下查找,找到)

if [ -z “$JPDA_ADDRESS” ]; then JPDA_ADDRESS=”localhost:8000” fi

② 把 “8000”,修改成一个未被占用的端口,并保存
③ 杀死原来的服务
④ 使用命令重启服务(注意:不是使用 .start.sh 启动服务)
sh catalina.sh jpda start
⑤ 在 IDEA 的 Run/Debug Configurations 中填入相应的信息 — ip 和端口(④中修改的端口)。

SSH 服务器跳转

  • SSH 相关
    • 从本服务器跳转到另外一台服务器

ssh ip 地址
ssh ip 地址(不需要加端口)
# 在回车后的提示中输出跳转后的服务器的密码,即可正常访问使用

  • 从当前服务器复制文件到B服务器

在服当前服务器执行以下命令
scp -r 欲上传的文件名 root@远端服务器ip地址:远端服务器保存文件的路径
eg. scp –r ./hehe root@10.66.77.88:/home/haha/

复制当前服务器文件到远端服务器(免密码输入)

  1. # 远端服务器的 ip
  2. remoteIp=
  3. # 远端服务器的端口
  4. remotePort=
  5. # 远端服务器的密码
  6. remotePwd=
  7. # 远端服务器保存文件的路径
  8. remoteDirPath=
  9. # 本服务器需要复制的文件路径
  10. copyFilePath=
  11. # 安装 sshpass 命令
  12. yum -y install sshpass
  13. #sshpass -p 远端服务器密码 scp -o StrictHostKeyChecking=no -P 远端服务器端口 -r 本地要拷贝的路径 root@远端服务器IP:远端服务器要保存的路径
  14. sshpass -p ${remotePwd} scp -o StrictHostKeyChecking=no -P ${remotePort} -r ${copyFilePath} root@${remoteIp}:${remoteDirPath}

从远端服务器复制文件到当前服务器(免密码输入)

  1. #sshpass -p 远端服务器密码 scp -o StrictHostKeyChecking=no -P 当前服务器的端口 -r 远端服务器的用户名@远端服务器IP:远端服务器要拷贝的文件路径 当前服务器要保存的路径
  2. sshpass -p ${remotePwd} scp -o StrictHostKeyChecking=no -P ${localPort} -r ${remoteUser}@${remoteIp}:${remoteDirPath}/* ${localDirPath}/

小结:
#sshpass -p 远端服务器密码 scp -o StrictHostKeyChecking=no -P 远端服务器端口 -r 本地要拷贝的路径 root@远端服务器IP:远端服务器要保存的路径

sshpass -p 远端服务器密码 scp -o StrictHostKeyChecking=no -P 当前服务器的端口 -r 远端服务器的用户名@远端服务器IP:远端服务器要拷贝的文件路径 当前服务器要保存的路径


Vim 模式

  • 跳到指定行

[行数]gg 或者 [行数]G

  1. 5gg # 跳转到第 5 行
  2. 5G # 跳转到第 5 行
  3. gg # 不输入行数,跳到文档行首
  4. G # 不输入行数,跳到文档末尾
  • 删除某行

[行数]dd

  1. 5dd # 删除从光标往下的5行
  2. dd # 不写行数,删除光标当前所在行
  3. D # 删除当前行光标之后的内容
  4. Ctrl + U #删除当前行光标之前的内容(编辑模式)
  • 撤销

    1. u # 撤销
  • 重做

    1. Ctrl + r # 重做
  • 保存并退出

    1. ZZ # 按住 Shift ZZ,快速保存(或者使用 :wq)
  • 不保存退出编辑

    1. ZQ # 不保存退出编辑(或者使用 :q!)
  • 显示行号

    1. :set nu # 显示行号 #用法: 输入":set nu"
  • 向后搜索

/ # 向后搜索 # 举例: 输入”:/redis

  • 向前搜索

? # 向前搜索 # 举例: 输入”:?redis”

  • 查找下一处

n # 查找下一处

  • 查找上一处

N # 查找上一处

  • 复制

yy 复制光标所在的那一行
nyy 复制光标所在的向下n行

  • 粘贴(后)

p 粘贴(后)

  • 粘贴(前)

P 粘贴(前)
删除到行末
D # 删除至行末(从光标位置开始)
删除到行首
Ctrl U # 删除至行末(从光标位置开始)(编辑模式)

o:下一行输入
O:上一行输入

  • 全局替换 ```shell

    文件内替换

:%s/原字符串/替换后的字符串/g # 替换每一个字符串 eg. :%/old/new/g

文件外替换

sed -i “s#原字符串#替换后的字符串#g” 文件名 eg. sed -i “s#old#new#g” abc.txt

  1. 替换
  2. > :s 命令替换字符串(当前行)
  3. >
  4. > :s/p1/p2/ 替换当前行第一个p1p2
  5. > :s/p1/p2/g 替换当前行所有的p1p2
  6. >
  7. > :n1,n2s 命令替换字符串(指定行)
  8. >
  9. > n1,n2s/p1/p2/g 将第n1n2行中所有p1均用p2替代。其中n1n2为行号,可以为.代表当前行,可以为$代表最后一行
  10. >
  11. > :.,$s/p1/p2/g 用字符串p2替换当前行到末尾所有出现的字符p1
  12. > :1,$s/p1/p2/g 用字符串p2替换所有出现的字符p1
  13. >
  14. > :%s命令替换字符串(全文)
  15. >
  16. > :%s/p1/p2/(等同于:g/p1/s//p2/) 替换每一行的第一个p1为p2
  17. > :%s/p1/p2/g(等同于:g/p1/s//p2/g) 替换每一行中所有p1为p2
  18. >
  19. > 2.g选项的总结
  20. >
  21. > g放在命令末尾,表示对搜索字符串的每次出现进行替换;不加g,表示只对搜索字符串的首次出现进行替换。
  22. > g放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
  23. - 其它不常用功能
  24. | 光标所在行行首<br />L 屏幕所显示的底行<br />{ 段首<br />} 段尾<br />- 前一行行首<br />+ 后一行行首<br />( 句首<br />) 下一句首<br />$ 行末<br />M 屏幕中间行<br />0 行首(零)<br />hjkl 左下上右<br />x 删除光标所在字符<br />R 替换模式(可以替换任意字符)<br />r 单个替换<br /> <br />s 删除字符并插入(单个字符删除,并进入插入模式)<br />S 删除行并插入(整行删除)<br />>> 缩进(相当于一个tab)<br /><< 反缩进<br />= 自动格式化<br />J 合并上下两行<br />I 插入到行首<br />i 插入<br />C 从光标处开始修改至行位<br />a 在光标后附件或追加<br />A 在行末追加
  25. ---
  26. <a name="fwQKG"></a>
  27. #
  28. ---
  29. <a name="vLLpG"></a>
  30. #
  31. <a name="XBtGi"></a>
  32. # Shell相关
  33. - 调用方法 functionA_ 并传递参数<br />
  34. ```shell
  35. # 先定义一个方法
  36. function funcationA_()
  37. {
  38. echo "这是一个函数"
  39. # 调用方法时传递的第一个参数,即 33
  40. var1=$1
  41. # 调用方法时传递的第二个参数,即 444
  42. var2=$2
  43. echo "$var1" ## 33
  44. echo "$var2" ## 444
  45. }
  1. # 调用方法,并传递参数
  2. functionA_ 33 444


[注意事项]
shell中必须先定义,再调用方法。否则将会报错。

  • 登录mysql数据库,并执行操作
    ```shell

    定义变量,用来保存数据库名

    DB_name=IFCSDB_NEW SQL_Password=123456

mysql -u root -p$SQL_Password —connect-expired-password <<EOF use $DB_name; source ${SQLFilePath}/abc.sql; exit EOF # 这行必须从行首开始

  1. ** [注意事项]**<br />SQL文件中必须不能包括"#"开头的注释行,否则使用 shell 脚本调用(或使用 Navicat 执行 SQL 文件)的时候会出现 MySQL 语句报错。解决办法是将所有的"#"开头的注释改成"--"形式的注释。
  2. - server.xml中获取服务端口<br />
  3. - 两步骤走的方法:
  4. # ① 获取得到: "50163"<br /># IFCS_Port=`cat ${Old_IFCS_Path}/conf/server.xml |grep -E "protocol=\"HTTP/1.1\"| "protocol="HTTP/1.1"| awk '{print $2}'|awk 'NR==1{print}' |cut -d"=" -f2`<br /># ② 将"双引号",去掉,得到 50163<br /># IFCS_Port=`echo ${IFCS_Port} | sed 's/\"//g'`
  5. - 二合一的方法:
  6. IFCS_Port=`cat tomcat/conf/server.xml |grep -E "protocol=\"HTTP/1.1\"| "protocol="HTTP/1.1"| awk '{print $2}'|awk 'NR==1{print}' | cut -d "=" -f2 | cut -d "\"" -f2`<br />
  7. - 启动服务,设置内存大小<br />
  8. ```sql
  9. nohup java -server -Xms512m -Xmx1G -Xss512k -XX:+HeapDumpOnOutOfMemoryError -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:ParallelGCThreads=4 -jar ${Server_Jar_Name}.jar >/dev/null 2>&1 &


Mysql 相关

  • 启动

systemctl start mysqld or service mysql start

  • 关闭

systemctl stop mysqld or service mysql stop

  • 重启

systemctl restart mysqld or service mysql restart

  • 登录

    • 密码明文

    语法:**mysql -u用户名 -p'用户密码'**
    举例:
    mysql -uroot -p’123456’

    • 密码密文

    语法:mysql -u用户名 -p+回车,然后输入密码
    举例:
    mysql -uroot -p
    123456



redis 相关

  • 启动(默认端口:6379)

./redis-server redis.conf

  • 修改密码(设置密码为:123456)

requirepass 123456



kafka

  • 启动 kafka

bin/zookeeper-server-start.sh config/zookeeper.properties