Bootstrap

【最全】linux三剑客和常用命令及shell脚本

目录

linux三剑客(grep、sed、awk)

使用grep命令条件过滤查找

使用sed命令替换

使用awk命令分割后读取

Shell脚本

快速读取文件每一行的方法

Shell脚本中[ ] 和 [[]]区别

Shell脚本中$符号的几种用法 

1.1 引用变量

1.2 上条命令的返回值

1.3 执行并获取命令输出

1.4 表达式求值

shell中$(( ))、$( )、``与${ }的区别

Linux 执行脚本时 source 和 . 和 sh 和 ./ 的区别

常用命令

0、nohup后台运行进程

1、使用ls命令查看

2、使用du命令查看

3、使用wc命令查看

4、查询哪个进程在使用这个端口号

5、pssh批量操作服务器

6、日志太多,想看最近一段时间的tail日志

7、free -h是看运存 df -h看磁盘空间 du -sh * 查询目录的总大小

8、找文件及文件内容

9、查询cpu核数

10、查询服务的安装位置

11、Top的使用

12、目录权限的修改,及配置文件

13、重置文件内容

15、批量拷贝文件到指定主机上(for循环里走scp命令)

16、批量查看机器的hostname或ip


常用工具Linux命令查询器—LZL在线工具

linux三剑客(grep、sed、awk)

简单过滤文件内容:grep

想要替换修改内容:sed

取列做数据统计:awk

使用grep命令条件过滤查找

  • grep命令的结果将显示每一个包含匹配模式的行。

命令格式:grep [选项] 模式 文件名

这里的模式,要么是字符串,要么是正则表达式。常用的选项如下表。

参数选项:
    -i    过滤内容不区分大小写
    -c    统计行数
    -v    取反 取文件中的空行和注释的行进行取反
    -o    显示匹配过程
    -E    支持扩展正则    egrep
    -c    统计单词数量
    -r    递归过滤文件内容
    -A    显示过滤到行,再往下显示n行
    -B    显示过滤到行,再往上显示n行
    -C    显示过滤到行,再往上下显示n行

    -n    显示行数

grep -20 "Noah Link Error" bces_metrics.log 查询文档关键字前后20行

cat filename|grep -E 'xxx' >1.txt 抓取关键字到新文件

使用sed命令替换

  • sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供一组规则来编辑数据流。sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本中。
  • sed是从文件或者管道中读取一行放在模式空间中进行处理,处理完输出一行,在读取一行,再处理一行。模式空间是sed内部的临时缓存,用于存放读取到的内容。

命令格式:sed [options] [sed-commands] [input-file]

  • options常用的有:

        -n  抑制默认输出

        -e  执行多条编辑命令

        -i  直接在源文件中修改

                  -f  表示用指定脚本文件来处理输入的文本文件

  • sed-commands:既可以是单个sed命令,也可以是多个sed命令组合。
  • input-file:可选项,sed还可以从标准输出如管道获取输入。

常用命令格式:

sed -e '操作' 文件1 文件2

sed -n -e '操作' 文件1 文件2

sed -f 脚本文件 文件1 文件2

sed -e -i '操作' 文件1 文件2

常用sed命令格式:

    s        替换指定字符(替换)
    d        删除指定的行(删除)
    a        在指定的行上一行增加一行指定内容(增加)
    i         在指定的上一行插入一行指定内容(插入)
    c        将选定行内容替换为指定内容(替换)
    y        字符转换,转换之后的字符长度必须相同。
    p        打印,如果同时指定行,表示打印指定行,如果不指定行,则表示打印所有内容;如果有非打印字符,则以Ascii码输出。通常与-n选项一起使用
    =        打印行号。
    l         答应数据流中的文本和不可打印的ASCII字符

关于sed的“增删改查”

查:

sed -n '3p' /etc/shadow                         查看指定第三行

sed -n '3,6p' /etc/shadow                      查看3-6行的内容

sed -n '/^root/p' /etc/shadow                查看以root开头的行

删:

并不是真正的删除了文件中的内容,如果想要真正的删除文件中的内容需要添加选项-i
sed '/^$/d' file                        删除空白行
sed '2d' file                            删除文件的第2行
sed '2,$d' file                         删除文件的第2行到末尾所有行
sed '$d' file                            删除文件最后一行
sed '/^test/'d file                    删除文件中所有开头是test的行

增:
sed -i '5i\###' test.conf                在test.conf文件第5行之前插入###
sed -i '2a\###' test.conf               在 test.conf 文件第2行之后插入###

改:

命令格式:sed 指定行 's/需要替换的字符串/替换后的字符串/替换标记'

替换标记:

g # 表示行内全面替换。  
p # 表示打印行。  
w # 表示把行写入一个文件。  
x # 表示互换模板块中的文本和缓冲区中的文本。  
y # 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 # 子串匹配标记
& # 已匹配字符串标记

sed 's/test/taget/g' test1.txt                         将文件中的test替换为taget

echo sksksksksksk | sed 's/sk/SK/2g'        需要从第N处匹配开始替换时,可以使用 /Ng

定界符

以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:

sed 's:test:TEXT:g'
sed 's|test|TEXT|g'

使用awk命令分割后读取

  • awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据进行分析并产生报告时,显得尤为强大。简单的说就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理。

命令格式:awk [选项] '脚本命令' 文件名

选项:

  • -F fs:指定以fs作为输入行的分隔符,awk命令默认分隔符为空格或者制表符。
  • -f file:从脚本文件中读取awk脚本指令,以取代直接在命令行中输入指令。
  • -v var=val:在执行处理过程之前,设置一个变量var,并给其设备的初始值为val。

awk的强大在于脚本命令

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块(pattern语句)、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号双引号

  • 匹配规则用来指定脚本命令可以作用到文本内容中的具体行,可以使用字符串或者正则表达式指定。

  • 整个脚本命令是用单引号括起来,而其中的执行命令部分需要用大括号括起来。

    有两部分组成,分别是匹配规则和执行命令。

    匹配规则{执行命令}

  • 脚本命令格式:'BEGIN{ print "start" } pattern{ commands } END{ print "end" }'

    BEGIN语句块 在awk开始从输入流中读取行 之前 被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

    END语句块 在awk从输入流中读取完所有的行 之后 即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

    pattern语句块 中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

在awk脚本程序中,支持使用变量来存取值,awk支持两种不同类型的变量,即内建变量和自定义变量。

常见的内建变量包括数据字段变量($0,$1,$2,....)和其他变量。

  • $0代表整个文本行。
  • $1代表文本行中的第一个数据字段。
  • $2代表文本行中的第二个数据字段。
  • $NF表示所有文件的最后一列

字符和记录分隔符变量:

  • FIELDWIDTHS:由空格分割的一列数字,定义了每个数据字段的确切宽度。
  • FNR:当前输入文档的记录编号,常在有多个输入文档时使用。
  • NR:输入流的当前记录编号。
  • FS:输入字段分隔符。
  • RS:输入记录分隔符,默认为换行符\n。
  • OFS:输出字段分隔符,默认为空格。
  • ORS:输出字段分隔符,默认为换行符\n。

使用示例:

echo "data11,data12,data13," |awk 'BEGIN{FS=",";OFS="-"}{print $1,$2,$3}'  逗号分割,“-”号拼接输出

echo "My name-is Rich" | awk -F '-' '{$2="Christine";print $0}'          指定“-”号分割并输出

awk 'NR==3{print $2}' 1.txt                               取第三行第二列的内容

awk -F "[/:]" '{print $1}' 1.txt                              以斜杠和冒号分割

awk -F: '/root/{print $1}' p.txt                            先模糊过滤找行,再找以冒号分割的第一列
awk -F: '/root/,/shutdown/{print $1}' p.txt        区间范围也没有问题

Shell脚本

常见shell脚本参考:7 个非常实用的 Shell 拿来就用脚本实例!

快速读取文件每一行的方法

1、使用while循环,效率最高,最常用的方法

while read -r line
do
   echo $line
done < filename

2、利用for循环的方法

for line in `cat filename`
do
 echo $line
done

echo输出不是一行的情况

注意:造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符(internal field separator)。
IFS环境变量定义了bash shell用作字段分隔符的一系列字符。默认情况下,bash shell会将下列字符当作字段分隔符:空格、制表符、换行符。

Shell脚本中[ ] 和 [[]]区别

[ ]中可用的比较运算符只有==和!=,可用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。

[[ ]] 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ minger == ming? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

[[]]测试[]测试
< 排序比较不支持
> 排序比较不支持
&& 逻辑与-a 逻辑与
== 模式匹配==字符匹配
=~正则匹配不支持

Shell脚本中$符号的几种用法 

$ 符号说明
$0Shell 的命令本身
1到9表示 Shell 的第几个参数
$?显示最后命令的执行情况
$#传递到脚本的参数个数
$$脚本运行的当前进程 ID 号
$*以一个单字符串显示所有向脚本传递的参数
$!后台运行的最后一个进程的 ID 号
$-显示 Shell 使用的当前选项

1.1 引用变量

引用变量时,使用 $ 符号直接来进行引用,以及包括循环变量;

1

2

3

[root@localhost ~]# x=1024

[root@localhost ~]# echo $x

1024

利用双引号 " 将括起来的字符串支持变量插值。

1

2

3

[root@localhost ~]# x=1024

[root@localhost ~]# echo "x = $x"

x = 1024

使用 ${ } 作为单词边界。

1

2

3

[root@localhost ~]# x=1024

[root@localhost ~]# echo "x = ${x}xy"

x = 1024xy

使用 ${#} 获取变量字符串长度。

1

2

3

[root@localhost etc]# s=helloworld

[root@localhost etc]# echo "s.length = ${#s}"

s.length = 10

1.2 上条命令的返回值

使用 $? 上条命令的返回值。
0:表示没有错误,其他任何数值:表示有错误。

1

2

3

4

5

6

[root@localhost ~]# true 1024

[root@localhost ~]# echo $?

0

[root@localhost ~]# false 2048

[root@localhost ~]# echo $?

1

1.3 执行并获取命令输出

使用 $() 执行并获取命令输出赋值给变量,等于双引号的功能。

1

2

3

4

[root@localhost ~]# echo `date`

2016年 06月 05日 星期日 12:39:08 CST

[root@localhost ~]# echo $(date)

2016年 06月 05日 星期日 12:39:34 CST

1.4 表达式求值

1

2

3

4

5

6

7

8

[root@localhost ~]# echo $[1024 + 2048]

3072

[root@localhost ~]# expr 1024 + 2048

3072

[root@localhost ~]# a=1024

[root@localhost ~]# b=2048

[root@localhost ~]# echo $[ a + b ]

3072

shell中$(( ))、$( )、``与${ }的区别

简而言之:$(( ))属于执行计算公式,等价于$[ ],$( )和` `属于命令替换,${ }属于变量替换

(1)$( )与``(反引号):返回括号中命令的结果

在bash中,$( )与` `(反引号)都是用来作命令替换的,执行括号或者反引号中的命令。

命令替换变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行

示例:命令:$ echo today is $(date "+%Y-%m-%d"),显示:today is 2014-07-01

注:在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:

1)``很容易与''搞混乱,尤其对初学者来说。

2)在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。

最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。

(2)${ }变量替换

一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围

示例:

取路径、文件名、后缀

先赋值一个变量为一个路径,如下:

1

file=/dir1/dir2/dir3/my.file.txt

记忆方法如下:

  • # 是去掉左边(在键盘上 # 在 $ 之左边)
  • % 是去掉右边(在键盘上 % 在 $ 之右边)
  • 单一符号是最小匹配;两个符号是最大匹配
  • *是用来匹配不要的字符,也就是想要去掉的那部分
  • 还有指定字符分隔号,与*配合,决定取哪部分

还有其他用法如下:

Linux 执行脚本时 source 和 . 和 sh 和 ./ 的区别

一般Linux上执行一个shell脚本,有如下几种方法:

source test.sh
. test.sh
bash test.sh
./test.sh
source 和 .

source和 . 这两个都是shell自带的内建命令,这两个命令是等价的关系。也就是说这两条命令的执行是完全一样的。使用 type source 和 type . 可以看出它们都是内建命令;使用 help source 和 help . 也可以看出这两个命令的作用一模一样。因此,这两个命令是等价的,用哪个都行。

作用:在当前 shell 中执行一个文件中的命令。即不会启动一个新的子 shell 进程。所有在脚本中设置的变量将成为当前Shell的一部分。

sh filename 或 bash filename

sh filename 另起一个子 shell 进程,在子 shell 中执行脚本里面的语句,该子 shell 继承父 shell 的环境变量(但不会继承普通变量,也就是没有被 export 的变量)。

./filename

./ 是用来执行一切可执行文件(bin、sh等)的方法,不仅仅可以用来执行shell脚本。需要特别注意的是 ./ 并不等于 . 符号,两者是具有本质区别的。使用 ./ 执行的文件必须是可执行文件,文件必须有 x 权限。

./也会另起一个 shell 进行可执行文件的执行。

常用命令

0、nohup后台运行进程

ls -lh &> 文件
ls -lh > 文件 2>&1
##解释第二个语句
ls -lh  标准输出 1 输出到屏幕
> 文件  1 通过>(重定向输出)到文件
2>&1    2 指向 1 (错误输出指定到标准输出) ,又此时 1 指向文件 ,所以 2 也就指向了 log.txt


# 后台运行runoob.sh脚本,并将标准错误和标准输出记录到runoob.log文件中
nohup /root/runoob.sh > runoob.log 2>&1 &

1、使用ls命令查看

使用“ls -l filepath”查看文件大小,第五列为文件字节数。

使用“ls -lh filepath”查看文件大小,加-h参数可以人性化显示文件大小。

2、使用du命令查看

即“df xxx”,显示的是xx文件所在分区的磁盘使用情况,而“du xxx”显示的是xxx文件的大小。

du命令是对文件和目录磁盘使用的空间的查看

使用“du -b filepath”查看文件大小,其中参数-b表示以字节计数。

使用“du -h filepath”查看文件大小,其中参数-h表示人性化显示。

3、使用wc命令查看

使用“wc -c filename”得到字节数,其中参数

-c统计字节数

-l 统计文件行数

-w或--words 只显示字数

4、查询哪个进程在使用这个端口号

lsof -i  | grep 端口号    kill -9 进程
lsof -i:端口号
netstat -tunlp|grep 端口号

-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名

-a或--all 显示所有连线中的Socket。   ---必要的时候,把其他机器使用列出来

5、pssh和pscp批量操作服务器

-l        远程机器的用户名 
-p       一次最大允许多少连接 
-o       输出内容重定向到一个文件 
-e       执行错误重定向到一个文件 
-t        设置命令执行的超时时间 
-A      提示输入密码并且把密码传递给ssh(注意这个参数添加后只是提示作用,随便输入或者不输入直接回车都可以) 
-O      设置ssh参数的具体配置,参照ssh_config配置文件 
-x      传递多个SSH 命令,多个命令用空格分开,用引号括起来 
-X     同-x 但是一次只能传递一个命令 
-i      显示标准输出和标准错误在每台host执行完毕后

-h     主机文件列表,内容格式”[user@]host[:port]”

示例:pssh -t 0 -l root -h ma -i -p 10 "ls -l"

示例:pscp -l root -h ./ngw_succ_list 本地文件 目标文件

6、日志太多,想看最近一段时间的tail日志

tail -f xxx.log             ----实时刷新最新日志
tail -100f xxx.log      --------实时刷新最新的100行日志
tail -100f xxx.log | grep [关键字]     -------查找最新的一百行中与关键字匹配的行
tail -100f xxx.log | grep '2019-10-29 16:4[0-9]'    ------查找最新的100行中时间范围在2019-10-29 16:40-2019-10-29 16:49范围中的行

tail -100f xxx.log | grep '2019-10-29 16:4[0-9]' --line-buffered

7、free -h是看运存 df -h看磁盘空间 du -sh * 查询目录的总大小

8、找文件及文件内容

模糊查询文件 :find / -name 'make-3.*.rpm'

多文件检索字符串:grep  -n -i -r "header" *.log(-n显示行数,-i忽略大小写,-r递归查询)

查找目录下的普通文件关键字,find /root/ –type f |xargs grep “www”

9、查询cpu核数

cat /proc/cpuinfo

nproc

lscpu

10、查询服务的安装位置

pwdx pid

11、Top的使用

使用top命令,看到负载均衡,除以核数>5就超标了

看cpu%,自己占内存,内核空间占用CPU的百分比,空闲CPU百分比

看mem%

    total:总内存量
    free:空闲内存
    used:已用内存
    buff/cache:缓存内存

看下面S列为R的是正在运行,,S是睡眠

shift+p看cpu排序,shift+m看内存排序,

点c看运行路径

点b看正在运行的,也很有用

12、目录权限的修改,及配置文件

修改root下的/etc/profile文件,其他用户都会改,这个相当于只有root才能改的系统参数配置

修改用户下的.bash_profile文件,只修改自己用户的环境变量,引入环境变量,之后source下生效

修改文件夹的权限,可以chown -R 用户名:用户组  目录  及   chmod -R 755 目录  

也可以把文件夹放到用户组,只要其他用户有该组就能访问

13、重置文件内容

cat /dev/null > filename利用 /dev/null 这一特殊设备和重定向来清空文件
: > filename

> filename
清空 filename,如果文件不存在,则创建文件
":“与”>“之间有无空格均可
”:"充当虚拟占位符,不产生任何输出

cat url-list.txt | xargs wget -c

xargs

-t 选项 可以打印出 xargs 执行的命令

-p 选项 会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用

-I 选项 指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换掉

-d 选项 可以自定义一个标准输入的定界符(分隔符)

-n 选项 定义每个命令行参数的列数

当你想用一条命令解决迭代文件每行数据做逻辑处理时,可用xargs。就免去了使用for循环迭代读取文件

例:复制所有图片文件到 /data/images 目录下

ls *.jpg | xargs -n1 -I cp {} /data/images

15、批量拷贝文件到指定主机上(for循环里走scp命令)

for i in `cat stage2_machine_list`;do echo $i;scp /home/cloud_op_local/switch_slow_path.sh $i:/tmp;echo "";done

16、批量查看机器的hostname或ip

根据hostname解析ip

parallel host {} < hostnames |awk -F " " '{print $4}'

根据ip解析hostname

 parallel host {} < ip_list|awk -F " " '{print $5}'|awk -F ".baidu.com." '{print $1}'

;