Linux常用命令 shell脚本for QA-数据脱敏版2

由于博客官网存在图片上传失败的bug  https://blogdev.blog.csdn.net/article/details/94006575   故此我之前的【Linux常用命令】的博客不可以编辑了https://blog.csdn.net/weixin_42498050/article/details/81037479,故此新建个博客吧~~

98. cat /proc/cpuinfo | grep "model name" | cut -d ':' -f 2 |sort -u

Linux常用命令 shell脚本for QA-数据脱敏版2_第1张图片

  • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。  byte
  • -c :以字符为单位进行分割。  char
  • -d :自定义分隔符,默认为制表符。  define
  • -f :与-d一起使用,指定显示哪个区域。   fields   一般用以指定分隔符后的第几列
  • -n :消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
    范围之内,该字符将被写出;否则,该字符将被排除

97. awk打印除某列之外的所有列

cat 1.txt| awk '{x=2;while(x<=NF){printf "%s ", $x;x++;}printf "\n"}' > nice.txt

cat 1.txt|awk '{$1 = null ;print}' > nice.txt

47             listeners="org.uncommons.reportng.HTMLReporter,org.testng.reporters.FailedReporter" >

48            

49            

50            

51        

52    

53

96. 计算cpu利用率的shell脚本

[root@edge-node1 tmp]# cat /proc/stat  查看CPU
cpu  125094388 160 19646788 3863197092 1316929 22008021 20012906 0 105025966 0
cpu0 2300773 0 316963 59961223 28218 350919 322074 0 1989117 0
cpu1 1885273 2 1076616 59629637 19424 345949 333747 0 261688 0
cpu2 1777766 2 382328 60422289 24439 351985 339369 0 1086476 0
cpu3 1591870 11 367656 60620419 20955 352620 342047 0 1049030 0
cpu4 1573398 0 352758 60652301 21908 352368 340665 0 1072780 0

各个参数的具体解释:

第一排是cpu总计,下面是2个4核cpu的参数,故有8行数据

user (494881706) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒

nice (19) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)

system (67370877) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)

idle (876689477) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)

iowait (17202366) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) 

irq (200116) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)

softirq (0) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

CPU利用率技术脚本:本脚本持续显示cpu的利用率

知道了/proc文件的内容之后就可以计算cpu的利用率了,具体方法是:先在t1时刻读取文件内容,获得此时cpu的运行情况,然后等待一段时间在t2时刻再次读取文件内容,获取cpu的运行情况,然后根据两个时刻的数据通过以下方式计算cpu的利用率:100 – (idle2 – idle1)*100/(total2 – total1)  其中total = user + system + nice + idle + iowait + irq + softirq

#!/bin/bash
while(true)
do

                                                                                                                                                                        #   $1       $2       $3           $4     $5         $6     $7                                                              
CPU_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')    #打印第一行cpu每列,user    nice   system4     idle  iowait      irq   softirq 
SYS_IDLE_1=$(echo $CPU_1 | awk '{print $4}')     #打印第4列idle,从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间
Total_1=$(echo $CPU_1 | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')     #打印cpu全部列之和
sleep 2    #等待2秒
CPU_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')     #再次取最新的列
SYS_IDLE_2=$(echo $CPU_2 | awk '{print $4}')     #再次打印第4列idle,从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间
Total_2=$(echo $CPU_2 | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')     #第二次打印cpu全部列之和
SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`    #expr命令是一个手工命令行计数器,用于求表达式变量的值,一般用于整数值,也可用于字符串 > expr length “this is a test”  为14(算上空格了)

Total=`expr $Total_2 - $Total_1`      #2次cpu总和的差值
TT=`expr $SYS_IDLE \* 100`          # (idle2 – idle1)*100   
SYS_USAGE=`expr $TT / $Total`   # (idle2 – idle1)*100/(total2 – total1)
SYS_Rate=`expr 100 - $SYS_USAGE`    #cpu利用率为100 – (idle2 – idle1)*100/(total2 – total1)  
echo "The CPU Rate : $SYS_Rate%"
echo "------------------"
done

Linux常用命令 shell脚本for QA-数据脱敏版2_第2张图片

 复制粘贴以下

#!/bin/bash
while(true)
do
CPU_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_1=$(echo $CPU_1 | awk '{print $4}')
Total01=$(echo $CPU_1 | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
sleep 2
CPU_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
SYS_IDLE_2=$(echo $CPU_2 | awk '{print $4}')
Total_2=$(echo $CPU_2 | awk '{printf "%.f",$1+$2+$3+$4+$5+$6+$7}')
SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
Total=`expr $Total_2 - $Total01`
TT=`expr $SYS_IDLE \* 100`
SYS_USAGE=`expr $TT / $Total`
SYS_Rate=`expr 100 - $SYS_USAGE`
echo "The CPU Rate : $SYS_Rate%"
echo "------------------"
done

求cpu利用率的平均值

cat 1.txt |cut -d ':' -f 2|awk '{sum+=$1}END{print "Average = ", sum/NR*2}'    

Linux常用命令 shell脚本for QA-数据脱敏版2_第3张图片

94. vim使用(三):.viminfo和.vimrc
viminfo

在vim中操作的行为,vim会自动记录下来,保存在 ~/.viminfo 文件中。
这样为了方便下次处理,
如:vim打开文件时,光标会自动在上次离开的位置显示。
原来搜索过的字符串,新打开文件时自动高亮显示。

~/.viminfo 文件是系统自动生成。

vimrc

vimrc文件是vim的环境设置文件。
整体的vim的设置是在 /etc/vimrc 文件中。
不建议修改/etc/vimrc 文件,每个用户可以在用户根目录中设置vim,新建 ~/.vimrc.
vim的配置选项较多,
:set all

93. cat less more的区别

less比grep不占内存

cat是一次性显示整个文件的内容,more和less一般用于显示文件内容超过一屏的内容,并且提供翻页的功能。more比cat强大,提供分页显示的功能,less比more更强大,提供翻页,跳转,查找等命令。而且more和less都支持:用空格显示下一页,按键b显示上一页。

92. more /proc/cpuinfo |grep 'processor'|wc -l

Linux常用命令 shell脚本for QA-数据脱敏版2_第4张图片

91. 全局查找某个字符

grep --color=auto -rns "findName" *

grep  -rn可以关键词查找符合条件的文件的行;去重文件名,然后xargs替换模式

grep -nr "centos-5-x64"

适用场景:我们经常会碰到一个报错但是却不知道配置文件的路径在哪里,这时候用rn就能轻松解决

Linux常用命令 shell脚本for QA-数据脱敏版2_第5张图片

[xx@xx ~]# grep -nr "centos-5-x64"
kubespray/tests/cloud_playbooks/create-do.yml:25:      - centos-5-x64
Binary file kubespray-edge-develop-xx-v1.0.6.tar matches

-n, --line-number,---常用
               在显示 行前,标上行号 。
               
            ex:   $   grep-npanda file  
                显示结果相似于下:
                行号:符合行的内容

-r, --recursive,---常用
        递归地 ,读取每个资料夹下的所有档案,此相当于 -d recsuse 参数。

linux输出文件的指定行

1.获取第k行(以k=10为例)

要注意的是,如果文件包含内容不足10行,应该不输出.

# Read from the file file.txt and output the tenth line to stdout.
# 解法一,使用awk
awk 'NR == 10' file.txt

# 解法二,使用sed(个人测试结果:sed方法比awk快)
sed -n '10p' file.txt

# 解法三,组合使用tail与head
tail -n+10 file.txt | head -n1

# 另外,以下这种方法不符合要求
head file.txt -n10 | tail -n1 # 因为如果文件包含内容不足10行,会输出最后一行

[xx@xx ~]# sed -n '25p' kubespray/tests/cloud_playbooks/create-do.yml
      - centos-5-x64
[root@node1 ~]# awk 'NR==25' kubespray/tests/cloud_playbooks/create-do.yml
      - centos-5-x64

90. 修改history展示日志条数,为 history 增加时间戳

vi /etc/profile
46 HISTSIZE=5  修改数目为5则显示50条日志
47 export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S"

Linux常用命令 shell脚本for QA-数据脱敏版2_第6张图片


"%Y-%m-%d %H:%M:%S " 等价于 "%F %T" 

保存完毕后,source /etc/profile

查看最近10  20条日志

history 10

history 20

Linux查找以前输入的命令

1.上下键

2.history命令

3.用 Ctrl+r 快捷键,反向查找历史命令(reverse-i-search)

按下 Ctrl+r 快捷键后,进入了反向搜索状态,这时你输入一个字符,系统会找到最近一个包含这个字符的命令,如果不是这条命令的话,可以再按下 Ctrl + R,Bash 会向前搜索有输入的字符的命令

找到你想要的命令后,你可以按回车执行这条命令。还可以按上下键查找该命令前后的命令,按左右键移动光标并修改这条命令

89. vim模式下忽略大小写查找字符串 如文件中有A a希望查找a结果A也可被查找出

vim模式下,输入命令 set ignorecase,在没关闭该文件前提下,字符串的查找都将不区分大小写

88. Linux中vi vim模式下让set nu在每次启动vi时候自己自动生效  vim模式打开的文件默认显示行号设置 

# vim /etc/vimrc

在文件最后一行添加 set nu

不需要source

87.  多个文件内容写到一个文件 cat file1 file2 file3 > fileAll

# cat c1n4to5.txt c2n4to5.txt  c3n4to5.txt > node4tonode5.log
# wc -l node4tonode5.log  统计文件行数
5427 node4tonode5.log

86. Linux命令之control快捷键组合

ctrl+a:光标移到行首。

ctrl+b:光标左移一个字母

ctrl+c:杀死当前进程。

ctrl+d:退出当前 Shell。

ctrl+e:光标移到行尾。

ctrl+h:删除光标前一个字符,同 backspace 键相同。

ctrl+k:清除光标后至行尾的内容。

ctrl+l:清屏,相当于clear。

ctrl+r:搜索之前打过的命令。会有一个提示,根据你输入的关键字进行搜索bash的history

ctrl+u: 清除光标前至行首间的所有内容。

ctrl+w: 移除光标前的一个单词

ctrl+t: 交换光标位置前的两个字符

ctrl+y: 粘贴或者恢复上次的删除

ctrl+d: 删除光标所在字母;注意和backspace以及ctrl+h的区别,这2个是删除光标前的字符

ctrl+f: 光标右移

ctrl+z : 把当前进程转到后台运行,使用’ fg ‘命令恢复。比如top -d1 然后ctrl+z ,到后台,然后fg,重新恢复

esc组合

esc+d: 删除光标后的一个词

esc+f: 先按esc再按f 不可以同时按。往右跳一个词

esc+b: 先按esc再按b 不可以同时按。往左跳一个词

esc+t: 交换光标位置前的两个单词。

85. vim下统计字符串出现的次数

关键命令:

:%s/pattern//gn

参数说明:

 % :指明操作区间,%表示全文本;可以使用1,$或者行区间代替

 s:substitute,表示替换

 pattern:要查找的字符串

 //:替代文本应该放在这里,两个斜杠中间没有任何字符表示无替代文本

 g:替换该行所有出现的字符串,如果没有该参数则只替换该行第一次出现的地方

 n:表示匹配的行数

84. 查看服务器系统以及版本  一般公司都是用centos 有的Ubuntu debain

# cat /etc/redhat-release

CentOS Linux release 7.5.1804 (Core)

# uname -a
Linux lxco 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

el7就是系统了

查看服务器系统

# hostnamectl
   Static hostname: xx
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxx
           Boot ID: xx
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-862.el7.x86_64
      Architecture: x86-64

83. hostname -i 显示当前机器的 ip 地址

82. 查找iperf3服务器路径  which  iperf3

81. 服务器 8C16G为8核16G

查看CPU核数 more /proc/cpuinfo |grep "physical id"|grep "0"|wc -l 

查看磁盘 free -g 

Linux常用命令 shell脚本for QA-数据脱敏版2_第7张图片

参考博客https://blog.csdn.net/weixin_39628256/article/details/111551427

# cat /proc/cpuinfo   查看物理cpu

有多少physical id 就有多少个cpu,我们的服务器是8个

有多少个core id就有多少核 --8个物理内核

总的CPU物理内核数 = 物理CPU数 * 每颗物理CPU的内核数  8*8=64



cat /proc/cpuinfo |grep "physical id"|grep "0"|wc -l   查看物理CPU个数
24
grep "physical id" /proc/cpuinfo|sort -u|wc -l   
2
cat /proc/cpuinfo| grep "processor"| wc -l    查看逻辑CPU个数 逻辑CPU内核
48
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
48  Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz

cat /proc/cpuinfo| grep "cpu cores"| uniq   查看每个物理CPU中core的个数(即核数)  

cpu cores : 6

Linux常用命令 shell脚本for QA-数据脱敏版2_第8张图片

80. 批量创建文件夹

mkdir -p /mnt/simth/sdk/daystar

78. Mac查看本机ip地址

Linux常用命令 shell脚本for QA-数据脱敏版2_第9张图片

Linux常用命令 shell脚本for QA-数据脱敏版2_第10张图片

77. vim设置编码格式

:set ff  查看当前文本的模式类型,一般为dos,unix
:set ff=dos  设置为dos模式, 也可以用 sed -i 's/$/\r/' 
:set ff=unix  设置为unix模式,也可以用一下方式转换为unix模式:sed -i 's/.$//g'
:set fileencoding查看现在文本的编码
:set fenc=编码  转换当前文本的编码为指定的编码
:set enc=编码  以指定的编码显示文本,但不保存到文件中

常用:set enc=utf-8

Linux常用命令 shell脚本for QA-数据脱敏版2_第11张图片

76.

.表示执行的意思,就是执行这个文件。

./表示执行当前目录下的某个文件,就比如当前目录有一个脚本a.sh,那么./a.sh就表示执行它

75. GDB学习https://www.cnblogs.com/arnoldlu/p/9633254.html

GDB调试的三种方式:

1. 目标板直接使用GDB进行调试。

2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端。

3. 目标板使用ulimit -c unlimited,生成core文件;然后主机使用xxx-linux-gdb ./test ./core。

74. 内存不足,解决办法:杀进程    扩内存

free -m

Linux常用命令 shell脚本for QA-数据脱敏版2_第12张图片

free -g

73. 今天通过日志来统计系统的执行情况,通过uniq -c之后发现还是存在重复列

查看uniq的说明,uniq去重,应该是行之间连续的重复。所以先进行排序 sort,在uniq -c 进行统计

➜  Downloads cat origin 

a

c

c

d

e

d

➜  Downloads cat origin|awk '{print $1}'|uniq -c >quchong      按照文本里的内容顺序正序显示  把连续的行数去掉 如cc 为2c  非连续的行d与d之间有e 显示1d 1e 1d  显示行号+内容

➜  Downloads cat quchong                                 

   1 a

   2 c

   1 d

   1 e

   1 d

➜  Downloads cat origin|awk '{print $1}'|uniq -c |sort >quchong     按照文本里的内容顺序正序显示  但按照次数从低到高展示 把连续的行 非连续的行都去重了   显示行号+内容

➜  Downloads cat quchong

   1 a

   1 d

   1 d

   1 e

   2 c

➜  Downloads cat origin|awk '{print $1}'|uniq -c |sort -nr >quchong     按照文本里的内容顺序逆序显示  但按照次数从高到底展示 把连续的行 非连续的行都去重了   

➜  Downloads cat quchong                                           

   2 c

   1 e

   1 d

   1 d

   1 a

➜  Downloads cat origin|awk '{print $1}'|sort -u >quchong    按照文本里的内容顺序正序显示  不显示出现的次数 只显示去重后的内容 

➜  Downloads cat quchong                                 

a

c

d

e

Linux常用命令 shell脚本for QA-数据脱敏版2_第13张图片

72. shell脚本sh文件里的内部要打印的echo内容不能写  ` ` 如果是定义的变量可以写 如 pid=`netstat -atnp 2>/dev/null|grep 8080|grep LISTEN|awk '{print $7}'    |awk -F'/' '{print $1}'`

➜  Desktop cat 1.sh

`echo 'a'`

➜  Desktop sh 1.sh 

1.sh: line 1: a: command not found

➜  Desktop cat 2.sh 

echo 'a'

➜  Desktop sh 2.sh

a

Linux常用命令 shell脚本for QA-数据脱敏版2_第14张图片

71.多个命令可连着用 用;分割   如 pwd;ll

Linux常用命令 shell脚本for QA-数据脱敏版2_第15张图片

Linux常用命令 shell脚本for QA-数据脱敏版2_第16张图片

70. 如果要把文件解压到指定的目录下,需要用到-d参数
unzip -d /filepath/xx test.zip

或者unzip -d ./test test.zip

69. diff filenameA filenameB

显示不同的行信息

Linux常用命令 shell脚本for QA-数据脱敏版2_第17张图片

Linux常用命令 shell脚本for QA-数据脱敏版2_第18张图片

68. ➜  Desktop ls -l|grep '\d*.txt$'    

查找本地文件以数字开头 .txt结尾的文件

Linux常用命令 shell脚本for QA-数据脱敏版2_第19张图片

查找以a开头b结尾的行

➜  Desktop cat 1.txt|grep '^a\S*b$'

查找a出现的次数

➜  Desktop cat 1.txt|grep -o 'a'|wc -l

Linux常用命令 shell脚本for QA-数据脱敏版2_第20张图片

67. 软链接

把文件路径/文件名称软链接到 文件名称

ln -s ../filename/filepath/xx.sh xx.sh

$ ln -s A/a.sh a.sh

Linux常用命令 shell脚本for QA-数据脱敏版2_第21张图片

硬链接 :硬链接(hard link,也称链接)就是一个文件的一个或多个文件名。再说白点,所谓链接无非是把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录

硬链接就是让多个不在或者同在一个目录下的文件名,同时能够修改同一个文件,其中一个修改后,所有与其有硬链接的文件都一起修改了

Linux系统下,硬链接和软链接的区别

1.在Linux系统中,有硬链接和软件链接两种“特殊”的文件存在的。

硬链接:通过文件系统的inode来产生新档名,而不是产生新档案。

软链接:看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。

2.创建方法都很简单:

软链接(符号链接) ln -s aa bb

硬链接 (实体链接)ln aa bb

3.链接数目是不一样的,软链接的链接数目不会增加;

4.文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了,BBB大小是95B,而BBBsoft是3B。因为BBB共有3个字符

66.  sh -x xx.sh

-x 显示shell执行过程中的命令

65. 统计一个文件hello出现的次数

➜  Desktop cat 3.txt|grep -c 'hello'

2

➜  Desktop cat 3.txt|grep 'hello'|wc -l

2

某个目录文件夹下查找某个文件

➜  Desktop ll|grep ali

Linux常用命令 shell脚本for QA-数据脱敏版2_第22张图片

64. shell对日志接口耗时的统计,正则符号[的过滤 需要加\\转义

➜  Desktop cat 1.txt                                                       

  :false}}] all_t[163.39] un[]

  :false}}] all_t[134.19] un[]

  :false}}] all_t[100] un[]

➜  Desktop cat 1.txt|awk -F 'all_t\\[' '{print $2}'|awk -F ']' '{print $1}'

163.39

134.19

100

Linux常用命令 shell脚本for QA-数据脱敏版2_第23张图片

shell多行求和,多行求平均值。如需求:求压测接口的平均耗时

cat 1.txt|awk -F 'all_t\\[' '{print $2}'|awk -F ']' '{print $1}'|awk '{sum+=$1}END{print "Average = ", sum/NR}'

Linux常用命令 shell脚本for QA-数据脱敏版2_第24张图片

63. 查看文件的md5

md5sum xx.tar.gz

62. 多人在服务器部署自己的服务 重启

ps -ef|grep server|grep username|awk '{print $2}'|xargs kill -9

61. vim模式 按单词删除  dw    == delete word

删除单个字符x

按单词跳转w

复制多行:nyy  如3yy 复制3行 按下p粘贴

查看vim下搜索历史:  ? + shift + command + H 上下箭头选中历史记录query

60. 打印日志中的userid去重并去除空格并在每行后面追加,

head -10 request.log|awk -F 'realUserId":"' '{print $2}'|awk -F '",' '{print $1}'|sort -u|sed 's/[[:space:]]//g'|sed 's/$/,/g'

Linux常用命令 shell脚本for QA-数据脱敏版2_第25张图片

59. shell从第一个字符截取到最后一个(,)字符中间。echo ${a%,*}

创建1.sh的文件

Linux常用命令 shell脚本for QA-数据脱敏版2_第26张图片

 

a=1,2,3:/home/work/,4

echo $a

echo '-----------------------------------'

echo ${a%,*}

Linux常用命令 shell脚本for QA-数据脱敏版2_第27张图片

结果

1,2,3:/home/work/,4

-----------------------------------

1,2,3:/home/work/

Linux常用命令 shell脚本for QA-数据脱敏版2_第28张图片

2) 使用 % 截取左边字符

使用%号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:

${string%chars*}

请注意*的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*应该位于 chars 的右侧。其他方面%#的用法相同,这里不再赘述,仅举例说明:

  1. #!/bin/bash
  2. url="http://c.biancheng.net/index.html"
  3. echo ${url%/*} #结果为 http://c.biancheng.net
  4. echo ${url%%/*} #结果为 http:
  5. str="---aa+++aa@@@"
  6. echo ${str%aa*} #结果为 ---aa+++
  7. echo ${str%%aa*} #结果为 ---

58. 端口查询进程查询项目路径

 netstat -nap|grep 8129

 ll /proc/688/cwd

57. 查看端口号对应的进程号,只打印进程号这一列

1> 查端口时

netstat -nap|grep 8011

tcp        0      0 0.0.0.0:8011                0.0.0.0:*                   LISTEN      21486/servername

                                                                                                               第7列为 进程pid/服务名称

只打印进程pid
netstat atnp 2>/dev/null|grep 8011|grep LISTEN|awk '{print $7}'|awk -F'/' '{print $1}'

结果为 21486

netstat -nap 可以grep端口 进程 servename

2> 查进程时

netstat -nap|grep 21486
tcp        0      0 0.0.0.0:8123                0.0.0.0:*                   LISTEN      21486/servicename
tcp        0      0 127.0.0.1:21486             127.0.0.1:793               TIME_WAIT   -

3> 查服务器名称时

 ps -ef|grep servicename

work     21404 12433  0 20:58 pts/6    00:00:00 grep servicename
work     21486     1 14 20:48 ?        00:01:30 /home/xx/servicename

shell脚本 根据端口查询服务进程 根据进程查询服务路径

    pid=`netstat -atnp 2>/dev/null|grep ${port}|grep LISTEN|awk '{print $7}'|awk -F'/' '{print $1}'`
    if [[ $pid == '' ]]; then
        continue
    fi
    env_path=`ls -l /proc/${pid}/cwd|awk '{print $11}'`

解释:ll /proc/21486/cwd 的执行结果为
lrwxrwxrwx. 1 work work 0 Oct 21 20:48 /proc/21486/cwd -> /home/xx/servicename/xx

服务器路径为从左往右数第11个字符(lrwxrwxrwx. 为第1个字符 1为第2个字符 work为第3个字符。过滤空格逐个数)

4> 日志文件截取错误日志并去重

grep ERROR log/xx/xx.log.wf*|awk -F 'ERROR:' '{print $2}'|sort|uniq -c

56. shell脚本 更新代码

shell 中if [ -e/d/f ..... ] 详解

文件表达式
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真 

https://blog.csdn.net/lukabruce/article/details/98845437

#!/bin/bash

port=$1

# 如果filename1文件夹不存在则git clone拉取仓库代码

if [ ! -d filename1 ];then
    git clone ssh://xx.com
else

# 如果存在文件夹说明非第一次拉取代码,保证版本一致才reset?则需要更新RD代码
    git reset --hard
    git pull

# 有几个 if 就对应有几个 fi。到下面一段完整的if else fi结束
fi

# 更新第二个仓库

if [ ! -d filename2 ];then
    git clone ssh://xx
else
    git reset --hard
    git pull
fi

# update env port
sed -i 's/80xx/'${port}'/g' xx/xx/xx/xx.toml
sed -i 's/80xx/'${port}'/g' xx/xx/xx/yy.conf

55. 如果发送的是http://ip:port/online_uid.txt 这种的链接,可以用wget下载
Linux常用命令 shell脚本for QA-数据脱敏版2_第29张图片

54. vim模式下删除某段,某行,或者全部删除的命令

1.先打开某个文件
vim filename
2.转到文件尾行
直接在命令模式下输入 G
3.转到第 N 行
在命令模式下,输入 NG (N代表第几行)
4.删除所有内容
先在命令模式下输入 G  光标跳转至行尾
再输入 
:1,.d
5.删除第n行到第m(m>n)行的内容 删除多行 删除指定的行
先在命令模式下输入 mG (将光标移动至该行, 也可以使用+来进行光标移动)
再执行如下命令
:n,.d(表示删除从第n行到当前光标所在行)

如删除1181到1830行

先:1830跳到第1830行 再:1811,.d

删除完成左下方显示 20 fewer lines


6.关于删除的一些说明
* 在vim中,"."表示当前行,“1,.”表示从第一行到当前行,“d”表示删除。
* 如果只是想删除某一行,直接将光标移至该行,输入dd即可。
7.设置显示行号
在vim里执行
:set number

Linux常用命令 shell脚本for QA-数据脱敏版2_第30张图片

Linux常用命令 shell脚本for QA-数据脱敏版2_第31张图片

需求:线上日志流程回放 改为我们需要的最新传参如uid cuid 类型,2w行数据要包含3种类型。因此批量替换后还需要各种组合

取前7000行数据写到新的文件A,原始文件删除前7000行。取第二个7000行再替换成新的类型写到新的文件B。依次循环,最后把文件ABC写到一个文件All

:%s/first:"/first:"小品/g

head -7000 req_file_7_xx >req_file_7_xx_xiaopin

:%s/小品/相声/g

head -7000 req_file_7_xx >req_file_7_xx_xiangsheng

:%s/相声/广场舞/g

cat req_file*>req_file_7_xx

cat req_file* > all_file_old
cat all_file_old |wc -l
40000

如删除文件前7000行 

:set nu

:7000

:1,.d

执行完了提示少了7000行

Linux常用命令 shell脚本for QA-数据脱敏版2_第32张图片

用sed命令 删除10001到29999行

sed -i '10001,29999'd req_file7no.bak

53. 捞取线上日志 灌数据

$0整行 $1分隔后的第一列 $2分隔后的第二列

从第一个-F截取到第二个-F 取截图的部分作为需要的数据

cat xx.log.notice |awk -F 'uid: "' '{print $2}' |awk -F '"' '{print $1}'|sort -u>uid.txt

cat xx.log.notice |awk -F 'cuid: "' '{print $2}' |awk -F '"' '{print $1}'|sort -u>cuid.txt

找到以xx开头的 从第二列开始截取 ,找到以yy结尾的  截取第一列

52. 截取字符串中的某个字符,去重写到新的文件 

Linux常用命令 shell脚本for QA-数据脱敏版2_第33张图片

cat new.txt |awk -F 'pre_xx"' '{print $2}'|awk -F '],' '{print $1}'|sed 's#:\[##g'|sort -u>sortnew.txt

 cat new.txt |awk -F 'pre_xx"' '{print $2}'|awk -F '],' '{print $1}'|sed 's/:\[//g'|sort -u>sortnew.txt

 cat xx.dict|awk -F 'history_bots":' '{print $2}'|awk -F '],' '{print $1}'|sort -u

51. head : -n  指定获取前几行。 例如命令: ifconfig |head -n2 表示只查看ifconfig的前两行,而tail   -n 是指定查看后几行。如果想要查看ifconfig的第二行,则先输入命令:ifconfig |head -n2 用enter键确认,然后在输入命令:ifconfig |head -n2 |tail -n1 即可。就可以实现只看ifconfig 的第二行

 cat filename |head -n5|tail -n2

Linux如何通过命令查看日志文件的某几行(中间几行或最后几行)

linux 如何显示一个文件的某几行(中间几行)

【一】从第3000行开始,显示1000行。即显示3000~3999行

cat filename | tail -n +3000 | head -n 1000

【二】显示1000行到3000行

cat filename| head -n 3000 | tail -n +1000

*注意两种方法的顺序

分解:

    tail -n 1000:显示最后1000行

    tail -n +1000:从1000行开始显示,显示1000行以后的

    head -n 1000:显示前面1000行

【三】用sed命令

 sed -n '5,10p' filename 这样你就可以只查看文件的第5行到第10行

50. linux中利用find命令分析日志,统计包含某字符串的行数

一、日志中,包含某条件的行数
find access_log.20160423.txt | xargs cat | grep .*POST\\s\\/upload\\/zyb-prd.*|wc -l
例子说明:统计含"POST /upload/zyb-prd"字符串的总行数
  
 
二、日志中,不包含某条件的行数
find access_log.20160423.txt | xargs cat | grep -v .*HEAD\\s\\/favicon.ico.*|wc -l

例子说明:统计不含"HEAD /favicon.ico"字符串的总行数

额外技能:查找文件夹下,查找包含某一个字符串的文件

# find -type f -name "*.c" | xargs grep ""
是你要找的文件夹;如果是当前文件夹可以省略
-type f 说明,只找文件
-name "*.c" 表示只找C语言写的代码,从而避免去查binary;也可以不写,表示找所有文件
是你要找的某个字符串

实际操作:

需求一个词典文件,一共多少行。统计包含entities的行是此次的新协议支持的格式,不包含entities的行是老的协议。分别写到不同的文件

首先查看词典文件总行数

cat filename.dict|wc -l   997行

查找文件下不含entities的行,统计次数,写到文件

find filename| xargs cat | grep -v entities|wc -l 或者 cat filename|grep -v entities|wc -l   2行

find filename| xargs cat | grep -v entities>old.txt  或者 cat filename|grep -v 'entities'>old.txt

查找文件下含entities的行,统计次数,写到文件

find filename| xargs cat | grep entities|wc -l  或者 grep -c 'entities' filename  995行

find filename | xargs cat | grep entities>new.txt 或者 cat filename|awk -F 'entities' '{print $0}'>new.txt

49. vim模式下输入tab键盘拆分字符串

Linux常用命令 shell脚本for QA-数据脱敏版2_第34张图片

先按下 :set noex按下tab

会变成:set noexpandtab

此时在b    bbb中间按下tab即可插入tab分割

Linux常用命令 shell脚本for QA-数据脱敏版2_第35张图片

插入tab后按下:set list即可展示tab  ,a aaa中间为空格不为tab

Linux常用命令 shell脚本for QA-数据脱敏版2_第36张图片

按下:set nolist 展示如上

:set list

发现空格大量存在 需要替换为tab

:%s/ /^I

1、文件中有 TAB 键的时候,你是看不见的。要把它显示出来:

:set list  
:set list

2.设定tab的位置 

:set tabstop=4  
:set tabstop=4

3.输入tab时自动将其转化为空格 

:set expandtab  
:set expandtab

48. vim模式下查找字符,不想模糊查找如LP20 有的为LP201也会被命中 则查询的时候在LP20 后加个tab表示空格

47. 显示日志中第N行 如第2行  sed -n '2p' 1.txt

 显示日志中从第M行到第N行  如第1行到第3行 sed -n '1,3p' 1.txt

Linux常用命令 shell脚本for QA-数据脱敏版2_第37张图片

显示第240339到240342行日志

sed -n '240339,240342p' rpc.log

46. linux文件夹打包命令

压缩文件夹

tar -zcvf report0305.tar.gz report0305/

Linux常用命令 shell脚本for QA-数据脱敏版2_第38张图片

解压缩文件夹

tar -zxvf report0305.tar.gz

Linux常用命令 shell脚本for QA-数据脱敏版2_第39张图片

.tar

解包:tar xvf FileName.tar

打包:tar cvf FileName.tar DirName

(注:tar是打包,不是压缩!)

---------------------------------------------

.gz

解压1:gunzip FileName.gz

解压2:gzip -d FileName.gz

压缩:gzip FileName 

.tar.gz

解压:tar zxvf FileName.tar.gz

压缩:tar zcvf FileName.tar.gz DirName

--------------------------------------------- 

.tgz

解压:tar zxvf FileName.tgz

压缩:未知

.tar.tgz

解压:tar zxvf FileName.tar.tgz

压缩:tar zcvf FileName.tar.tgz FileName

45. 文件为2列,只取第一列,并在第一列后面增加逗号, 转成自动化代码需要的格式

cat dict.txt | awk '{print $1}' > 1.txt

sed 's/$/,/g' 1.txt >2.txt

或者一条命令也可以

cat dict.txt | awk '{print $1}' | sed 's/$/,/g' 1.txt > 3.txt

处理为如下格式

11 LP_4993,
12 LP_348,
13 LP_554,

处理词典   cat skill_list_dict |awk '{print $1}'|sed 's/$/,/g' > skill_list_dict.deal

处理词典库   cat xx_skill_dict |awk '{print $1}'|sed 's/$/,/g' > xx_skill_dict.deal

Linux常用命令 shell脚本for QA-数据脱敏版2_第40张图片

截取systemId字段

cat skill_list_dict |awk -F '"systemId": "' '{print $2}'|awk -F '",' '{print $1}' > systemId.txt

在文件每行后添加, 

cat skill_list_dict |awk -F '"systemId": "' '{print $2}'|awk -F '",' '{print $1}'|sed 's/$/,/g'> systemId.txt

在文件每行后添加, 生成的文件去重

cat skill_list_dict |awk -F '"systemId": "' '{print $2}'|awk -F '",' '{print $1}'|sort -u |sed 's/$/,/g'> systemId.txt

Linux常用命令 shell脚本for QA-数据脱敏版2_第41张图片

44. vim模式下删除当前行后面所有的行

按下esc :

,$d

如400万行,找到3万行 :set nu (显示行数)  :30000 (跳到第3万行) 

vim模式下删除第一行到当前行

按下esc :

1,.d

 Linux常用命令 shell脚本for QA-数据脱敏版2_第42张图片

命令行模式下按b,将光标定位到单词首字母

按 dw 即可删除单词

43. ll几个比较常用的参数
-t 按最后修改时间排序
-S 按文件大小排序(大写的S)
-r 排序时按倒序
-h 显示文件大小时增加可读性 (例:1K 234M 2G)
如果这个aa是个普通文件,2就代表这个文件有2个别名(这个文件被人创建了一个硬链接文件)

Linux常用命令 shell脚本for QA-数据脱敏版2_第43张图片

42. cat 2.txt|awk -F 'userid:qa_test_lishan10_' '{print $2}'|awk -F ']' '{print $1}' | sort -u >3.txt

找到 以为userid 的字符 截它取从后面的第二个$2 |找到以 ] 结束的字符。把找到的字符串去重。最终按一行$1打印出来

文本中可能有重复的userid,文件文本去重

sort -u filename1.txt >filename2.txt

截取日志文件里的请求。最后一个]去不掉

cat debug_trace.log |awk -F '\\[ai.xxt\\] \\[ouput\\:' '{print $2}'|awk -F '{print $(NF-1)}' '{print $1}'|sort -u >rslog.txt

echo ${$(cat headlog.txt|awk -F '\\[ai.xx.bot.xx_request\\] \\[ouput\\:' '{print $2}'|awk -F '{print $(NF-1)}' '{print $1}'|uniq)%?}

截取日志中的userid

 head -10 request.log|grep realUserId|awk -F 'realUserId":"' '{print $2}'|awk -F '",' '{print $1}'|sort -u

41. 如遇

[user@hostname xx]$ rm -rf xx
mv: invalid option -- r
Try `mv --help' for more information.

不知道是谁配置了alias

vim ~/.bashrc

找到rm

alias rm = 'trash'; 删除

记得source ~/.bashrc

参考博客 https://blog.csdn.net/bug_love/article/details/78496590

40. linux根据进程查端口,端口查进程

根据进程pid查端口:netstat -nap | grep pid

根据端口port查进程:netstat -nap | grep port

根据pid查找文件的启动位置  ps aux | grep 进程,把找到的pid在/proc/pid|port的下方有一个为cwd对应的路径就是程序启动的路径

根据服务查进程 -- 根据主进程查端口,注意是主进程(第一列) -- 根据端口查服务路径

Linux常用命令 shell脚本for QA-数据脱敏版2_第44张图片

[user@hostname: path ] ps -ef|grep recommend|grep -v grep   // 根据服务查进程pid (主子进程)
work     27822 27821  6 06:43 ?        00:50:27 ./bin/recommend
[user@hostname: path ] netstat -nap | grep 27822   // 根据主进程查端口port,注意是主进程
tcp        0      0 0.0.0.0:8116                0.0.0.0:*                   LISTEN      27822/recommend
[user@hostname: path ]  ll /proc/8116/cwd   // 根据端口port查服务代码路径path。推荐端口查进行
lrwxrwxrwx 1 work work 0 Sep  4 20:23 /proc/8116/cwd -> /home/path/bin

推荐以上的方法

[user@hostname: path ] ll /proc/27822/cwd   // 根据主进程pid查服务代码路径path
lrwxrwxrwx 1 work work 0 Sep  6 17:18 /proc/27822/cwd -> /home/path/rs_audio

[user@hostname: path ] ll /proc/27821/cwd   // 根据子进程pid查服务代码路径path
lrwxrwxrwx 1 work work 0 Sep  6 17:18 /proc/27821/cwd -> /home/path/rs_audio

14700为主进程pid 14696为子进程pid

Linux常用命令 shell脚本for QA-数据脱敏版2_第45张图片

1.  根据进程pid查端口    lsof -i | grep pid   注意pid是主进程!!!

2.  根据端口port查进程    lsof  -i:port     

3. 根据进程pid查端口   netstat -nap | grep pid     注意pid是主进程!!!

4. 根据端口port查进程    netstat -nap | grep port

5. 根据端口port查进程    fuser -avn tcp 8014

根据进程pid查端口port

netstat -nap|grep 22963   注意是主进程非子进程pid 

第一行LISTEN的就是 ,第二行是配置文件的第二个端口,在第一行基础上+1

tcp最大连接数是1000

当应用程序以socket 端口的形式对外提供TCP服务时,会出现监听句柄LISTEN

外部客户端与服务端建立连接时,会在服务端内部生成连接句柄,而连接句柄根据TCP/IP的三次握手和四次挥手,会有不同的状态机

established 就是客户端与服务器成功建立连接时的一种状态

Linux常用命令 shell脚本for QA-数据脱敏版2_第46张图片

lsof -i|grep 22963   注意是主进程非子进程pid 

servername 22963 work   13u  IPv4   40544075      0t0  TCP hostname1(现在登录的):57772->hostname2:8490 (ESTABLISHED)

Linux常用命令 shell脚本for QA-数据脱敏版2_第47张图片

根据端口port查进程pid

netstat -nap|grep 8014

4行

tcp        0      0 0.0.0.0:8014                0.0.0.0:*                   LISTEN      22963/servername
tcp        0      0 127.0.0.1:38014             127.0.0.1:793               TIME_WAIT   -
tcp        0      0 127.0.0.1:58014             127.0.0.1:793               TIME_WAIT   -
tcp        0      0 127.0.0.1:48014             127.0.0.1:793               TIME_WAIT   -

Linux常用命令 shell脚本for QA-数据脱敏版2_第48张图片

lsof -i:8014

第二行

COMMAND     PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
servername 22963 work   11u  IPv4 39443477      0t0  TCP *:8014 (LISTEN)

fuser -avn tcp 8014

                     USER        PID ACCESS COMMAND
8014/tcp:            work      22963 F.... servername

Linux常用命令 shell脚本for QA-数据脱敏版2_第49张图片

work@hostname ~]$ netstat -nap|grep 8114
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:8114                0.0.0.0:*                   LISTEN      45012/rus_server
tcp        0      0 ip:8114          172.24.191.68:64585         ESTABLISHED 45012/rus_server
tcp        0      0 127.0.0.1:28114             127.0.0.1:793               TIME_WAIT   -
tcp        0      0 127.0.0.1:18114             127.0.0.1:793               TIME_WAIT   -
tcp        0      0 127.0.0.1:58114             127.0.0.1:793               TIME_WAIT   -
tcp        0      0 127.0.0.1:38114             127.0.0.1:793               TIME_WAIT   -
[work@hostname ~]$ netstat -nap|grep 8114|grep LISTEN|awk '{print $7}'|awk -F '/' '{print $1}'

45012

第7列是pid进程id/severname服务名称  找打/前面的算$1

39. Linux中查看当前文件夹下各文件夹大小命令

// 查看系统中文件的使用情况
df -h
// 查看当前目录下各个文件及目录占用空间大小
du -sh *

// 查看各文件夹大小

du -h --max-depth=1

38. tail -n +20 filename 是从文件第二十行开始显示 而不是显示前面二十行

tail -n 10  #输出文件最后10行的内容

 tail -n1 filename  输出文本最后一行 

Linux常用命令 shell脚本for QA-数据脱敏版2_第50张图片

37. tcp详解 https://blog.csdn.net/sinat_36629696/article/details/80740678

36. Linux下根据进程号查找程序路径

背景:有一个服务,只知道它占用的端口号是8703,但是不知道它的路径在哪儿。

思路:

  • 先根据端口号查找pid(进程号)
    netstat -nlp | grep 22
    结果如下:
unix  2      [ ACC ]     STREAM     LISTENING     12249    -                 

12249就是它的pid(进程号)

  • 再根据进程号查找路径,如下:
    ll /proc/12499/cwd
    cwd后面的路径就是端口号8703程序的路径

实际操作

netstat -nap|grep port 

LISTEN后面是pid

ll /proc/pid/cwd

根据进程pid找到程序路径

[user@hostname: path] netstat -nap|grep 8503
tcp        0      0 0.0.0.0:8503                0.0.0.0:*                   LISTEN      8884/recommend
tcp        0      0 10.xx.67.35:8503           10.xx.xx.xx:62005          ESTABLISHED 8884/recommend
tcp        0      0 10.xx.xx.xx:8503           xx.xx.xx.xx:54394        ESTABLISHED 8884/recommend
tcp        0      0 10.xx.xx.xx:8503           xx.xx.xx.xx:63111        ESTABLISHED 8884/recommend
[user@hostname: path ] ll /proc/8884/cwd
lrwxrwxrwx 1 work work 0 Sep  3 13:57 /proc/8884/cwd -> /home/xx/xx/xx/output

Linux常用命令 shell脚本for QA-数据脱敏版2_第51张图片

35. 在Linux下用VIM打开大小几个G、甚至几十个G的文件时,是非常慢的

这时,我们可以利用下面的方法分割文件,然后再打开

1 查看文件的前多少行并写入到新的文件

head -10000 /var/lib/mysql/slowquery.log > temp.log

上面命令的意思是:把slowquery.log文件前10000行的数据写入到temp.log文件中

1. 截取时间段

截取 2019-06-25 10:10 到 2019-06-25 10:20 之间的日志记录,apollo-service.log 为你要截取的文件名称, new2.log 截取之后保存日志的文件名称。

sed -n '/2019-06-25 10:10/, /2019-06-25 10:20/p' catalina.out  > new1.log

sed -n '/2019-06-25 10:20:47/, /2019-06-25 10:26:47/p' catalina.out  > new2.log

sed -n '/2019-06-25 10:20:47.728/, /2019-06-25 10:26:47.728/p' catalina.out  > new3.log

说明:时间段可根据自己的需要进行修改,可精确到毫秒。

2. 截取行数

截取 catalina.out  文件中的100 - 500 行的日志, new.log 为截取保存之后的文件。

 sed -n '100,500'p apollo-service.log > new.log

2 查看文件的后多少行并写入到新的文件

tail -10000 /var/lib/mysql/slowquery.log > temp.log

3 Linux 或 类Unix 下实现合并多个文件内容到一个文件中

cat req_file_* > all_file_old

head -100 alllog0909   查看文件前多少行

tail -100 alllog0909  查看文件后多少行

查看文件最后一行

34. 查询日志某个时间段的日志

sed -n '/^2018-08-17 14:29/,/^2018-08-17 14:30/p' info.log.20180817|grep 5000   

grep "20-09-02 14:26:56" filename.2020090214 --color

我要查shop-bussiness.log.2018-11-06文件中2018年11月6号11:34至11点37之间的日志信息,可以这么做:

grep '2018-Nov-06 11:3[4-7]' shop-bussiness.log.2018-11-06

注意开始和结束在文件要有shell的开始时间和结束时间这行,如日志中没有20-09-03 14:15:33这行则查询不出来

sed -n '/20-09-03 14:14:59/,/20-09-03 14:29:53/p' filename.log.2020090314

sed -n '/20-09-03 14:14:*/,/20-09-03 14:29:*/p' filename.log.2020090314 模糊查找好些  

grep -e '2020-09-03 14:14:*' -e '2020-09-03 14:29:*' filename.log.2020090314

33. Linux中在当前目录下查找某个文件

find / -iname centOS-7-x86_64-DVD-1810.iso    精准查找需要输入文件全称

find / -name centOS-7-x86_64-DVD-1810.iso   CentOS为大写首字母,精准查找不到,需要用 -iname忽略大小写

Linux常用命令 shell脚本for QA-数据脱敏版2_第52张图片

find . -name "filename"

 find . -name doudi_skill_dict

doudi_skill_dict是在此路径下


linux全局查询文件

在工作中,可能突然需要找到某个文件,但是又不知道在那个位置,需要全局查询一下。下面是命令行:

建议进入某个文件夹减小搜索返回

 第一种: 

find / -name "*.log" | xargs grep "vl"     

     /:意思是从/开始进行查找。

  意思是包含“vl”的行。

 不区分大小写

实际操作

find  -iname "vod_alias_seg.txt"

find . -name "vod_alias_seg.txt"

find / -name "vod_alias_seg.txt" | xargs grep "vl"

Linux常用命令 shell脚本for QA-数据脱敏版2_第53张图片

32. linux下全局替换字符 

执行如下sed -i "s/len/size/g" `grep len -rl ./`

其中,

len为原字符串

size为目标字符串

-rl是递归查找所有包含字符串len的文件

实际操作

sed -i "s/”/\"/g" `grep ” -rl ./`

把日志中的_t:换成_t: 格式

sed -i "s/_t:/_t: /g" `grep _t: -rl ./xx.log.notice*`

31. vim模式下复制多行

如果有一条数据,直接按数字1999p  显示多了1999行

按500p就是加500行 

Linux常用命令 shell脚本for QA-数据脱敏版2_第54张图片

yy复制一行
在命令行模式下5y回车可以复制5行 如一共1000行,当前在700行,执行500yy p 则复制了300行,一共1300行
p粘贴 复制的内容

删除当前行 dd

删除当前行以下所有行 跳转到指定行如:200  再dG

30. linux 除了某个文件或某个文件夹以外全部删除

find . -maxdepth 1 ! -name 0824all/ -exec rm -f {} \;

删除logs下非当前日期的日志

tail -n 100 info.log.20180531 |grep -E 'userId:434|userId:417|userId:418|userId:433|userId:434'

ls | grep -v -E "0531|sys.log" | xargs sudo rm -f

ls |grep -E -v '0612|sys.log' |xargs sudo rm -rf

29. 普通模式下的快捷键

快捷键   说明
  i    insert, 在光标所在处输入
  I    在当前光标所在行的行首输入
  a    append, 在光标所在处后面输入
  A    在当前光标所在行的行尾输入
  o    在当前光标所在行的下方打开一个新行
  O    在当前光标所在行的上方打开一个新行
  ZZ    保存退出
  ZQ    不保存退出

  :q   退出
  :q!    强制退出,丢弃做出的修改
  :wq   保存退出
  :x    保存退出

命令模式
  di"   光标在" "之间,则删除" "之间的内容

  yi(   光标在()之间,则复制()之间的内容
  vi[   光标在[]之间,则选中[]之间的内容
  dtx   删除字符直到遇见光标之后的第一个 x 字符
  ytx   复制字符直到遇见光标之后的第一个 x 字符

字符间跳转:
  h: 左 l: 右 j: 下 k: 上
  #COMMAND:跳转由#指定的个数的字符

单词间跳转:
  w:下一个单词的词首
  e:当前或下一单词的词尾
  b:当前或前一个单词的词首
  #COMMAND:由#指定一次跳转的单词数

当前页跳转:
  H:页首 M:页中间行 L:页底
  zt:将光标所在当前行移到屏幕顶端
  zz:将光标所在当前行移到屏幕中间
  zb:将光标所在当前行移到屏幕底端

行首行尾跳转:
  ^: 跳转至行首的第一个非空白字符
  0: 跳转至行首
  $: 跳转至行尾

行间移动:
  #G :扩展命令模式下:# 跳转至由#指定行
  G:最后一行
  1G, gg: 第一行

句间移动:
  ):下一句(:上一句

终端非vim模式下,按option+键盘左右为向前向后。control+A跳到终端模式下最前面,control+E跳到末尾

28.  查看文件行数 wc -l filename

或者vim模式shift+G

Linux常用命令 shell脚本for QA-数据脱敏版2_第55张图片

"all_file_old" 13993L, 7078991C

27. rm同时删除多个文件 rm -rf A B C

26. & 放在命令后面表示设置此进程为后台进程

默认情况下,进程是前台进程,这时此进程(命令执行相当于本质是开启一个进程)就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的

不加& 是前台执行,一直到执行结束 或者手动Ctrl+C 中断
加了& 是后台执行,后台执行完 也会在console打印结果(如果你的远程连接一直都在,没有从新连接过)

第一行加了&的  就退到后台去执行了  屏幕输出的  11886 是对应的进程号

所以console看不到执行过程,只会再执行完之后,屏幕给你一个结束的信息

不加&  始终在执行过程中,除非中断。输出的只有任务本身执行的输出信息,不会有进程号

./bin/xx start &

Linux常用命令 shell脚本for QA-数据脱敏版2_第56张图片

./bin/xx start

Linux常用命令 shell脚本for QA-数据脱敏版2_第57张图片

25. Linux 或 类Unix 下实现合并多个文件内容到一个文件中

cat req_file_* > all_file_old

 Linux常用命令 shell脚本for QA-数据脱敏版2_第58张图片

24. Linux统计文本中某个字符串出现的次数

vim模式下  :%s/findName//gn

Linux常用命令 shell脚本for QA-数据脱敏版2_第59张图片

非vim模式grep -o "findName" req_file.7 |wc -l

grep -o "self_t" ./xx.log.notice*|wc -l
Linux常用命令 shell脚本for QA-数据脱敏版2_第60张图片

23. vim模式

删除当前行2000,以下的全部行

shift+G到行尾或者2000G,按下shift+:

输入   :2000,.d   删除2000行以后的内容

22. mac地址/物理地址 

ifconfig -a

en0下的ether就是物理地址

Linux常用命令 shell脚本for QA-数据脱敏版2_第61张图片

21. 启动服务后

第一次查询端口占用情况显示未被占用。原因:服务还没启动完成

第二次查询端口占用情况显示一行LISTEN,未显示ESTABLISHED。原因:服务未被请求,不会有ESTABLISHED

ESTABLISHED的意思是建立连接。表示两台机器正在通信。当访问接口后,再次查看端口,此时有了ESTABLISHED

Linux常用命令 shell脚本for QA-数据脱敏版2_第62张图片

20. 远程机器拷贝  

scp filename为文件  scr -r filedict 为文件夹

scp -r A机器的filename或者file路径/ username@ip:/B机器文件的路径

如拷贝A机器的/a/b/c/d到B机器的/e/

B机器的ip为10.10.1.1

登录A机器

scp -r  /a/b/c/d [email protected]:/e/f

登录B机器查看/e/f有了d文件

复制目录命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder

Linux常用命令 shell脚本for QA-数据脱敏版2_第63张图片

或者sz rz

拷贝远程机器的文件到本机

scp work@remoteServerName:/home/xx/xx/filename ./


同机器拷贝 

cp -r A/ B

如果A文件夹过大,可以去B目录查看字节数以及时间。或者看B的文件夹外层更新时间

drwxrwxr-x 16 work work      4096 Aug 19 13:12 B

drwxrwxr-x 16 work work      4096 Aug 19 13:14 B

等拷贝完成  cp -r A/ B 也会在命令行下出一行回行显示机器的信息

cp显示拷贝进度

一段比较好的显示拷贝进度的shell代码

#!/bin/bash

PARAM_LIST=$*
PARAM_NUM=$#
TOTAL_SIZE=0
for((i = 0; i < PARAM_NUM - 1; i++))
do
        [ ! -r $1 ] && echo "Cannot read $1." && exit 1
        SIZE=`du -s $1 | awk '{print $1}'`
        ((TOTAL_SIZE = TOTAL_SIZE + SIZE))
        shift
done
TARGET=$1
START_TIME=`date +%s.%N`
cp -a $PARAM_LIST &
echo -ne "Total size: $TOTAL_SIZE KB - %"
while true
do
        LEN_PERCENT=${#PERCENT}
        for((i = 0; i <= LEN_PERCENT; i++))
        do
                echo -ne "/b"
        done
        COPIED=`du -s $TARGET | awk '{print $1}'`
        ((PERCENT = COPIED * 100 / TOTAL_SIZE))
        echo -ne "$PERCENT%"
        ((PERCENT == 100)) && END_TIME=`date +%s.%N` && break
done
MB_SECOND=`echo $TOTAL_SIZE/1024//($END_TIME-$START_TIME/)|bc`
echo " - SPEED: $MB_SECOND MB/s"

文件 AB同级目录 cp A B    B会覆盖之前B的内容

19. 之前的公司Jenkins脚本里有编译go等的shell脚本(拉代码 编译 上传 下载 移动文件夹 重启服务等),如果直接拿源码还需要搭建编译环境,自己编译,产出编译文件。这边直接拿编译后的编译产出wget到服务器

18. php是解释性语言 不需要编译。golang Java C C++ 都需要编译的

17. 解压缩tar.gz文件,tar.gz在macOS和Linux下常见

tar -zxvf output.tar.gz

或者 tar -xf  output.tar.gz

格式:tar zcvf 压缩后的路径及包名 你要压缩的文件

  z:gzip压缩

  c:创建压缩包

  v:显示打包压缩解压过程

  f:接着压缩

  t:查看压缩包内容

  x:解压

  X:指定文件列表形式排除不需要打包压缩的文件或目录

  -exclude:指定排除文件或目录不需要打包压缩的文件或目录(也可以用正则匹配/通配符等)

  -C:解压到指定目录

移动文件A到上层目录   mv A/ ./..

解压缩 filename.tgz格式

 tar -zxvf filename.tgz -C ./

压缩文件 把当前目录下的tools打包为tools.zip压缩包 zip -r tools.zip ./tools

解压缩 unzip tools.zip

16. Linux查看端口的占用情况并找出并杀死占用进程的方法

fuser -v -n tcp 8702

fuser -avn tcp 8503

fuser 可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息.

fuser只把PID输出到标准输出,其他的都输出到标准错误输出

-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。 
-c 和-m一样,用于POSIX兼容。 
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal

-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。

-l 列出所有已知的信号名称。 
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。 
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。 
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口,可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。 
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。  
-u 在每个PID后面添加进程拥有者的用户名称。 
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.

发现此端口对应Nginx的2个进程,需要杀掉进程号28243 28244。截图里的命令笔误输入错了

                     用户     进程号 权限   命令
8702/tcp:      work      28243 F.... nginx
                     work      28244 F.... nginx

kill -s 9 28243

kill -s 9 28244

Linux常用命令 shell脚本for QA-数据脱敏版2_第64张图片

批量杀进程

lsof -i:8503|awk '{print $2}'|xargs kill -9

Linux常用命令 shell脚本for QA-数据脱敏版2_第65张图片

Linux常用命令 shell脚本for QA-数据脱敏版2_第66张图片

netstat -naptul|grep port用来查看系统当前系统网络状态信息,包括端口,连接情况

用fuser查看哪些用户和进程在某些地方作什么

fuser -v -n tcp 8503
fuser -cu /root 简略显示
fuser -muv /mnt3 分列显示

lsof -i:port的作用是列出当前系统打开文件(list open files),不过通过-i参数也能查看端口的连接情况,-i后跟冒号端口可以查看指定端口信息,直接-i是系统当前所有打开的端口

lsof 拥有更多的功能
# lsof -i 看系统中有哪些开放的端口,哪些进程、用户在使用它们,比 netstat -lptu 的输出详细

Linux常用命令 shell脚本for QA-数据脱敏版2_第67张图片


根据端口查看占用进程/服务端   pid

$ netstat -nap|grep 8000
tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      8183/nginx -g

发现8000端口对应的进程是8183,服务为nginx

查看进程/服务占用情况 ps -ef|grep pid

查看进程主子进程 ps -ef|grep pid|grep -v grep|awk '{print $2}'

批量杀进程ps -ef|grep 8183|grep -v grep|awk '{print $2}'|xargs kill -9

重启服务 如webserver/loadnginx.sh start

启动后,查看8000端口占用情况,此时进程pid变了新的

$ netstat -nap|grep 8000
tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      14477/nginx -g

Linux常用命令 shell脚本for QA-数据脱敏版2_第68张图片

15. Linux下有三个命令:ls、grep、wc。通过这三个命令的组合可以统计目录下文件及文件夹的个数

统计当前目录下文件的个数(不包括目录)
$ ls -l | grep "^-" | wc -l

-rw-rw-r--
统计当前目录下文件的个数(包括子目录)
$ ls -lR| grep "^-" | wc -l

-rw-rw-r--

统计当前文件夹下目录的个数(不包括目录)
$ ls -l |grep "^d"|wc -l

drwxrwxr-x

查看某目录下文件夹(目录)的个数(包括子目录)
$ ls -lR | grep "^d" | wc -l

drwxrwxr-x

实际操作

Linux常用命令 shell脚本for QA-数据脱敏版2_第69张图片

14. hostname   查看host

hostname -i   查看ip地址

Linux常用命令 shell脚本for QA-数据脱敏版2_第70张图片

13. shell只能用相对路径,绝对路径无法执行的原因?

如 cd /A/B/C 

./filename restart

但是./A/B/C/filename restart则会报错

12. 不挂断地运行命令   nohup ./a 2>&1 > /dev/null &

https://www.jb51.net/article/169783.htm

这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃

后台运行,然后对于输出的内容丢弃不存储。后台运行并重定向输出

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)

该命令的一般形式为:nohup command &

nohup sh rs_log_xx.sh /home/xx/xx/xx/output/log 7 &

执行完显示进程号,结束进程号变为Done

Linux常用命令 shell脚本for QA-数据脱敏版2_第71张图片

nohup python xx.py v1 v2 &

会输出一个进程号

Linux常用命令 shell脚本for QA-数据脱敏版2_第72张图片

[1] 34301

nohup: appending output to ‘nohup.out’

查看这个进程 ps -ef|grep 34301

会看到>/dev/null 2>&1

Linux常用命令 shell脚本for QA-数据脱敏版2_第73张图片

结束会自动显示一行[1]+  Exit 1

Linux常用命令 shell脚本for QA-数据脱敏版2_第74张图片

11. 解释nohup, /dev/null 2>&1,输出重定向

Linux shell中有三种输入输出,分别为标准输入,标准输出,错误输出,分别对应0,1,2。我们可以直接通过输出重定向>(或>>,表示追加)将某种输出重定向到其他地方,如设备,文件,比如:

1 ls > ls.log  #标准输出重定向
2 ls 2> ls.log #标准错误重定向
3 ls > /dev/null #重定向到null设备,相当于直接忽略输出

但是,有时候,我们想把标准输出以及错误输出一起重定向某个文件,这是可以通过 2>&1 实现,也可以通过两个同时重定向到某个文件

1 ls >ls.log 2>&1 //标准输出重定向到ls.log,而错误又重定向到标准输出,这两个位置不可换
2

ls 2>>ls.log 1>>ls.log

先说一下linux重定向:
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:

# ls 1>/dev/null 2>/dev/null

还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:

# ls >/dev/null 2>&1

注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄:-)

由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题。

nohup ./program >/dev/null 2>log &

如果错误信息也不想要的话:

nohup ./program >/dev/null 2>&1 &

nohup sh cycleUdp.sh 2>&1|tee node4tonode5UDP.log &

Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

10. [文本处理] 多列合并一行的SHELL,以,隔开

➜  ~ awk '{a=a?a","$1:$1;b=b?b","$2:$2}END{print a,b}' 1.txt

9. 在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

实际运用:把文件1.txt的内容在每行结尾添加,写到2.txt 

Linux常用命令 shell脚本for QA-数据脱敏版2_第75张图片

➜  ~ sed 's/$/&,/g' 1.txt > 2.txt

Linux常用命令 shell脚本for QA-数据脱敏版2_第76张图片

8. 批量替换文件夹子文件夹的文件xx为yy

sed -i 's/xx/yy/g' `grep xx -rl ./`

注:后面为esc下面的` 不为'

Linux常用命令 shell脚本for QA-数据脱敏版2_第77张图片

7. linux命令统计文件中某个字符串出现的次数

用vim打开目标文件,在命令模式下,输入::%s/object/&/gn

&代表s// 搜索出来的内容
g代表全局替换(而非仅仅当前行)
n代表不执行,只是预览一下会有什么情况发生

执行前效果和执行后效果如图所示:

:%s/xx/&/gn

Linux常用命令 shell脚本for QA-数据脱敏版2_第78张图片

非vim模式:

zgrep -c 'xx' 1.txt

grep -c 'xx' 1.txt

grep 'xx' 1.txt |wc -l

Linux常用命令 shell脚本for QA-数据脱敏版2_第79张图片

6. top命令

Linux常用命令 shell脚本for QA-数据脱敏版2_第80张图片

用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况...

还有一种办法是 ps -ef | sort -k7 ,将进程按运行时间排序,看哪个进程消耗的cpu时间最多

free
1.作用
free命令用来显示内存的使用情况,使用权限是所有用户

Linux常用命令 shell脚本for QA-数据脱敏版2_第81张图片


**2.格式 **

free [-b-k-m] [-o] [-s delay] [-t] [-V] 

**3.主要参数 **

-b -k -m -g:分别以字节(KB、MB、GB)为单位显示内存使用情况。 
-s delay:显示每隔多少秒数来显示一次内存使用情况。 
-t:显示内存总和列。 
-o:不显示缓冲区调节列。 

uptime

18:59:15 up 25 min, 2 users, load average: 1.23, 1.32, 1.21 
现在的时间 
系统开机运转到现在经过的时间 
连线的使用者数量 
最近一分钟,五分钟和十五分钟的系统负载 
参数: -V 显示版本资讯。 

vmstat

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu---- 
r b swpd free buff cache si so bi bo in cs us sy id wa 
0 1 24980 10792 8296 47316 5 19 205 52 1161 698 26 3 1 70 

**1 观察磁盘活动情况 **
磁盘活动情况主要从以下几个指标了解:

bi:表示从磁盘每秒读取的块数(blocks/s)。数字越大,表示读磁盘的活动越多。 
bo:表示每秒写到磁盘的块数(blocks/s)。数字越大,表示写磁盘的活动越多。 
wa:cpu等待磁盘I/O(未决的磁盘IO)的时间比例。数字越大,表示文件系统活动阻碍cpu的情况越严重,因为cpu在等待慢速的磁盘系统提供数据。wa为0是最理想的。如果wa经常大于10,可能文件系统就需要进行性能调整了。 

**2 观察cpu活动情况 **
vmstat比top更能反映出cpu的使用情况:

us:用户程序使用cpu的时间比例。这个数字越大,表示用户进程越繁忙。 
sy: 系统调用使用cpu的时间比例。注意,NFS由于是在内核里面运行的,所以NFS活动所占用的cpu时间反映在sy里面。这个数字经常很大的话,就需要注 意是否某个内核进程,比如NFS任务比较繁重。如果us和sy同时都比较大的话,就需要考虑将某些用户程序分离到另外的服务器上面,以免互相影响。 
id:cpu空闲的时间比例。 
wa:cpu等待未决的磁盘IO的时间比例。 

iostat
用于统计CPU的使用情况及tty设备、硬盘和CD-ROM的I/0量

Linux常用命令 shell脚本for QA-数据脱敏版2_第82张图片

查看RAM使用情况最简单的方法是通过/proc/meminfo。这个动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / top)等的组合显示。/proc/meminfo列出了所有你想了解的内存的使用情况。进程的内存使用信息也可以通过/proc//statm 和 /proc//status 来查看

$ cat /proc/meminfo
MemTotal:        8388608 kB
MemFree:           19404 kB
MemAvailable:    8647836 kB
Buffers:               0 kB
Cached:          3883764 kB
SwapCached:            0 kB
Active:          6426584 kB
Inactive:        1942564 kB
Active(anon):    4485496 kB
Inactive(anon):     1008 kB
Active(file):    1941088 kB
Inactive(file):  1941556 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:             16880 kB
Writeback:             0 kB
AnonPages:      114106472 kB
Mapped:          3026292 kB
Shmem:            301604 kB
Slab:            7141536 kB
SReclaimable:    6245764 kB
SUnreclaim:       895772 kB
KernelStack:      350208 kB
PageTables:       484640 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    98901520 kB
Committed_AS:   273028180 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      714472 kB
VmallocChunk:   34358872316 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      343960 kB
DirectMap2M:    41486336 kB
DirectMap1G:    161480704 kB

5. 根据端口号查找进程号查找程序路径

netstat -nlp | grep 端口号

如下图所示,查询28180端口对应的进程PID-netstat -nlp | grep 28180

得到的8161就是进程PID

然后通过下面命令查询对应的程序路径

ll /proc/进程号/cwd

cwd — 指向当前进程运行目录的一个符号链接 

exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝 

4 .在文件最后一列加,逗号

sed 's/$/\,/g' a.txt   

sed 's/$/\,/g' -i a.txt

或者不需要转义   sed 's/$/,/g' a.txt

"^"代表行首,"$"代表行尾

字符g代表每行出现的字符全部替换

如果想导出文件,在命令末尾加"> outfile_name"

sed 's/$/,/g' a.txt > b.txt

实际操作:

把req_file7的类型为7的改为13 并保存到req_file13 如果不加后面的req_file13,则会在当前屏幕一直滚动展示实时数据,且req_file7的内容不会发生变化

sed 's/rec_type": 7/rec_type": 13/g' req_file7>req_file13

或者vim模式下 :%s/rec_type": 7/rec_type": 13/g

vim模式:

:%s/$/,/g

3. 去除文件第一列和最后一列

 了解 Hadoop,Hive,Hbase。
 了解前端技术 html,css 和 javascript 以及基本的使用。
 熟练掌握core Java 。

以上文本想实现效果:

了解 Hadoop,Hive,Hbase
了解前端技术 html,css 和 javascript 以及基本的使用
 熟练掌握core Java

sed -e "s/ /""/g" -e "s/。/""/g" 1.txt   

-e :直接在命令行模式上进行sed动作编辑,此为默认选项  -e : 可以在同一行里执行多条命令

awk '{$1="";print $0}' 1.txt   去除第一列

公司解析简历的系统很。。。。。。。
去除文件的第一列以及最后一列

sed -e "s/[^ ] /""/g" -e "s/。/""/g" 1.txt  

Linux常用命令 shell脚本for QA-数据脱敏版2_第83张图片

2. Mac下解压rar文件

使用Homebrew安装unrar(有关Homebrew的安装和使用见Homebrew)

brew install unrar  

unrar x filename.rar

1. 打开自动化运行后的测试报告,除了直接在idea中右击report.html文件Reveal in Finder外,还可以Copy Path,在iterm中用命令打开。不是说这个有多难,而是换一种思维方式,多种方法思考问题

open /Users/lishan/Desktop/code/UICheck/report.html

Linux常用命令 shell脚本for QA-数据脱敏版2_第84张图片

统计文件夹下文件个数

ls -LR|grep -i 'jpg'|wc -l

ls |grep -i 'jpg'|wc -l

参考ls博客:https://blog.csdn.net/zhouxiangbai/article/details/80510834

-L 列出链接文件名而不是链接到的文件。 
-N 不限制文件长度。 
-Q 把输出的文件名用双引号括起来。 
-R 列出所有子目录下的文件。 
-S 以文件大小排序。 
-X 以文件的扩展名(最后一个 . 后的字符)排序。 
-1 一行只输出一个文件

Linux常用命令 shell脚本for QA-数据脱敏版2_第85张图片

xattr 复制的文件属性去除  发现复制或者下载的文件属性为-rw-------@

这里的@貌似是mac特有的,第一次使用file_put_contents往根目录添加文件成功,
再次添加就提示
failed to open stream: Permission denied

解决方法:
mac终端下执行
xattr -c -r *

Linux常用命令 shell脚本for QA-数据脱敏版2_第86张图片

执行完merge操作后,没有修改代码

1、命令

1. git reflog
查看merge操作的上一个提交记录的版本号

2. git reset –hard 版本号
这样可以回滚到merge之前的状态

2、示例
误将dev合并到了master分支,现要回滚merge操作
1. 首先git reflog
ee0ee93 HEAD@{0}: merge dev: Merge made by the ‘recursive’ strategy.
7335548 HEAD@{1}: checkout: moving from dev to master
可以看到需要回滚到 7335548 这个提交记录上

2. 执行git reset --hard 7335548
再次查看提交记录:
7335548 HEAD@{0}: reset: moving to 7335548
ee0ee93 HEAD@{1}: merge dev: Merge made by the ‘recursive’ strategy.

亲自实践:

master代码合并到自己的分支clientreq,但想回滚 

git reflog
git reset --hard d91b25a
 

Linux常用命令 shell脚本for QA-数据脱敏版2_第87张图片

统计字符串出现次数Linux

这里统计某个字符串在文件里出现的次数使用到了-c参数,请见下图案例:

语法:grep -c  'object'   fileName

Linux常用命令 shell脚本for QA-数据脱敏版2_第88张图片

如何通过端口查找出进程所在目录?

一、找到端口对应的进程的号(PID)

[root@benbang ~]# ss -lntup|grep 6379
tcp    LISTEN     0      511    127.0.0.1:6379                  *:*                   users:(("redis-server",pid=914,fd=6))

二、显示/proc/进程号/cwd

cwd符号链接的是进程运行的目录

[root@benbang ~]# ll /proc/914/cwd
lrwxrwxrwx 1 redis redis 0 Aug  1 15:53 /proc/914/cwd -> /usr/local/redis/var

exe符号链接的是执行程序的绝对路径;

[root@benbang ~]# ll /proc/914/exe 
lrwxrwxrwx 1 redis redis 0 Jul 22 21:57 /proc/914/exe -> /usr/local/redis/bin/redis-server

cmdline就是程序运行时输入的命令行命令;
environ记录了进程运行时的环境变量;
fd目录下是进程打开或使用的文件的符号连接

复制代码

[root@benbang ~]# ll /proc/914/fd
total 0
lrwx------ 1 redis redis 64 Jul 22 21:58 0 -> /dev/null
lrwx------ 1 redis redis 64 Jul 22 21:58 1 -> /dev/null
lrwx------ 1 redis redis 64 Jul 22 21:58 2 -> /dev/null
lr-x------ 1 redis redis 64 Jul 22 21:58 3 -> pipe:[13725]
l-wx------ 1 redis redis 64 Jul 22 21:58 4 -> pipe:[13725]
lrwx------ 1 redis redis 64 Jul 22 21:58 5 -> anon_inode:[eventpoll]
lrwx------ 1 redis redis 64 Jul 22 21:58 6 -> socket:[13739]

1、lsof -i

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME init          1        root  cwd       DIR                8,1     4096          2 / init          1        root  rtd       DIR                8,1     4096          2 / init          1        root  txt       REG                8,1   150584     654127 /sbin/init udevd       415        root    0u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    1u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    2u      CHR                1,3      0t0       6254 /dev/null udevd       690        root  mem       REG                8,1    51736     302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so syslogd    1246      syslog    2w      REG                8,1    10187     245418 /var/log/auth.log syslogd    1246      syslog    3w      REG                8,1    10118     245342 /var/log/syslog dd         1271        root    0r      REG                0,3        0 4026532038 /proc/kmsg dd         1271        root    1w     FIFO               0,15      0t0        409 /run/klogd/kmsg dd         1271        root    2u      CHR                1,3      0t0       6254 /dev/null

 详细了解lsof,可以参考:https://www.cnblogs.com/sparkbj/p/7161669.html

2、netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息

     netstat -tunlp 显示tcp,udp的端口和进程等相关情况

     netstat -anp 也可以显示系统端口使用情况

netstat [选项]
 
-a或--all:显示所有连线中的Socket; 
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; 
-c或--continuous:持续列出网络状态; 
-C或--cache:显示路由器配置的快取信息; 
-e或--extend:显示网络其他相关信息; 
-F或--fib:显示FIB; 
-g或--groups:显示多重广播功能群组组员名单; 
-h或--help:在线帮助; 
-i或--interfaces:显示网络界面信息表单; 
-l或--listening:显示监控中的服务器的Socket; 
-M或--masquerade:显示伪装的网络连线; 
-n或--numeric:直接使用ip地址,而不通过域名服务器; 
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称; 
-o或--timers:显示计时器; 
-p或--programs:显示正在使用Socket的程序识别码和程序名称; 
-r或--route:显示Routing Table; 
-s或--statistice:显示网络工作信息统计表; 
-t或--tcp:显示TCP传输协议的连线状况; 
-u或--udp:显示UDP传输协议的连线状况; 
-v或--verbose:显示指令执行过程; 
-V或--version:显示版本信息; 
-w或--raw:显示RAW传输协议的连线状况; 
-x或--unix:此参数的效果和指定"-A unix"参数相同; 
--ip或--inet:此参数的效果和指定"-A inet"参数相同。
方法1: lsof -i 用以显示符合条件的进程情况,lsof(list open files)是一个列出当前系统打开文件的工具。

            以root用户来执行lsof -i命令,如下:

[root@hadoop01 yum.repos.d]# lsof -i
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind    1873     rpc    6u  IPv4  15228      0t0  UDP *:sunrpc 
rpcbind    1873     rpc    7u  IPv4  15230      0t0  UDP *:wpages 
rpcbind    1873     rpc    8u  IPv4  15231      0t0  TCP *:sunrpc (LISTEN)
rpcbind    1873     rpc    9u  IPv6  15233      0t0  UDP *:sunrpc 
rpcbind    1873     rpc   10u  IPv6  15235      0t0  UDP *:wpages 
rpcbind    1873     rpc   11u  IPv6  15236      0t0  TCP *:sunrpc (LISTEN)
rpc.statd  2017 rpcuser    5r  IPv4  15556      0t0  UDP *:921 
rpc.statd  2017 rpcuser    8u  IPv4  15563      0t0  UDP *:32846 
rpc.statd  2017 rpcuser    9u  IPv4  15567      0t0  TCP *:42335 (LISTEN)
rpc.statd  2017 rpcuser   10u  IPv6  15571      0t0  UDP *:41231 
rpc.statd  2017 rpcuser   11u  IPv6  15575      0t0  TCP *:56522 (LISTEN)
cupsd      2072    root    6u  IPv6  15795      0t0  TCP localhost:ipp (LISTEN)

nginx     11914  nobody   11u  IPv4  35803      0t0  TCP *:distinct (LISTEN)
 加端口号,查看端口被谁占用

lsof -i:端口号
例如:

注意:这里的9999端口是我自己打开的一个,前面博客提到过,如果自己没有此端口,请更换端口号

[root@hadoop01 yum.repos.d]# lsof -i:9999
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    3953   root   11u  IPv4  35803      0t0  TCP *:distinct (LISTEN)
nginx   11914 nobody   11u  IPv4  35803      0t0  TCP *:distinct (LISTEN)
 

方法2: netstat -tunlp命令用于显示tcp,udp的端口和进程等相关情况

[root@hadoop01 yum.repos.d]# netstat -tunpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:9999                0.0.0.0:*                   LISTEN      3953/nginx          
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1873/rpcbind        
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2191/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2072/cupsd          
tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      11504/sshd          
tcp        0      0 127.0.0.1:6011              0.0.0.0:*                   LISTEN      11716/sshd          
tcp        0      0 0.0.0.0:42335               0.0.0.0:*                   LISTEN      2017/rpc.statd      
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      2379/mysqld         
tcp        0      0 :::111                      :::*                        LISTEN      1873/rpcbind        
tcp        0      0 :::22                       :::*                        LISTEN      2191/sshd           
tcp        0      0 ::1:631                     :::*                        LISTEN      2072/cupsd          
tcp        0      0 ::1:6010                    :::*                        LISTEN      11504/sshd          

netstat -tunlp 会显示所有端口和所有对应的程序,用grep管道可以过滤出想要的关键字段,

列一下9999端口占用的程序:

注意:这里的9999端口是我自己打开的一个,前面博客提到过,如果自己没有此端口,请更换端口号

netstat -tunplp | grep 端口号
例如:

[root@hadoop01 yum.repos.d]# netstat -tunplp | grep 9999
tcp        0      0 0.0.0.0:9999                0.0.0.0:*                   LISTEN      3953/nginx  
使用netstat -anp进行查看

[root@hadoop01 yum.repos.d]# netstat -anp|grep 9999
tcp        0      0 0.0.0.0:9999                0.0.0.0:*                   LISTEN      3953/nginx  
所以这两种方法都可以查看。
 

待续

你可能感兴趣的:(Linux命令)