学习linux从0到初级工程师-2

本文详细介绍了Linux初级工程师需要掌握的基本命令,包括awk命令的脚本格式、变量、运算和实例,sed命令的选项注释、示例,grep命令的格式、选项参数、正则表达式以及实例,lsof命令的格式、选项参数和使用示例,以及tcpdump命令的定义、格式、选项参数及其在抓包分析中的应用。通过这些命令的学习,可以帮助读者深入理解Linux系统的日常运维工作。

一、linux初级工程师基本命令详解

1.1awk命令

awk [options] 'script' var=value file(s)

awk [options] -f scriptfile var=value file(s)

-F fs fs指定输入分隔符,fs可以是字符串或正则表达式

-v var=value 赋值一个用户定义变量,将外部变量传递给awk

-f scriptfile 从脚本文件中读取awk命令

awk命令脚本基本格式

awk 'BEGIN{ commands } pattern{ commands } END{ commands }' file

// 一个awk脚本通常由BEGIN,通用语句块,END语句块组成,三部分都是可选的。

// 脚本通常是被单引号或双引号包住。

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename

awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

awk变量

$n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。

$0 : 这个变量包含执行过程中当前行的文本内容。

ARGC : 命令行参数的数目。

ARGIND : 命令行中当前文件的位置(从0开始算)。

ARGV : 包含命令行参数的数组。

CONVFMT : 数字转换格式(默认值为%.6g)。

ENVIRON : 环境变量关联数组。

ERRNO : 最后一个系统错误的描述。

FIELDWIDTHS : 字段宽度列表(用空格键分隔)。

FILENAME : 当前输入文件的名。

NR : 表示记录数,在执行过程中对应于当前的行号

FNR : 同NR :,但相对于当前文件。

FS : 字段分隔符(默认是任何空格)。

IGNORECASE : 如果为真,则进行忽略大小写的匹配。

NF : 表示字段数,在执行过程中对应于当前的字段数。

print $NF答应一行中最后一个字段 OFMT : 数字的输出格式(默认值是%.6g)。

OFS : 输出字段分隔符(默认值是一个空格)。

ORS : 输出记录分隔符(默认值是一个换行符)。

RS : 记录分隔符(默认是一个换行符)。

RSTART : 由match函数所匹配的字符串的第一个位置。

RLENGTH : 由match函数所匹配的字符串的长度。

SUBSEP : 数组下标分隔符(默认值是34)。

将外部变量值传递给awk

#借助 -v 选项,可以将来自外部值(非stdin)传递给awk

VAR=100

echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'

#定义内部变量接收外部变量

var1="111"

var2="222"

echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2

awk运算

算术运算:(+,-,*,/,&,!,……,++,–)

所有用作算术运算符进行操作时,操作数自动转为数值,所有非数值都变为0

赋值运算:(=, +=, -=,*=,/=,%=,……=,**=)

逻辑运算符: (||, &&)

关系运算符:(<, <=, >,>=,!=, ==)

正则运算符:(~,~!)(匹配正则表达式,与不匹配正则表达式)

awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'

循环结构

for循环

for(变量 in 数组)  
{语句} 
     
for(变量;条件;表达式) 
{语句} 

while循环

while(表达式) 
    {语句} 

do…while循环

do  
{语句} while(条件) 

awk实例

print & $0

// print是awk打印指定内容的主要命令
$ awk '{print}' /etc/passwd == awk '{print $0}' /etc/passwd  

//不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
$ awk '{print " "}' /etc/passwd                                       

//输出相同个数的a行,一行只有一个a字母
$ awk '{print "a"}' /etc/passwd                                        

$ awk -F":" '{print $1}' /etc/passwd 
//将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
$ awk -F: '{print $1; print $2}' /etc/passwd    

//输出字段1,3,6,以制表符作为分隔符
$ awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd        

-f指定脚本文件

//效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
$ awk -f script.awk  file
    BEGIN{
    FS=":"
    }
    {print $1}               
 

$ awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test 
I find 4 blank lines.

//计算文件大小
$ ls -l | awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}'  total size is 17487

-F指定分隔符

// $1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符
// 一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
$ awk -F":" '{print $1}'  /etc/passwd

// $1与$3相连输出,不分隔
$ awk -F":" '{print $1 $3}'  /etc/passwd  

// 多了一个逗号,$1与$3使用空格分隔
$ awk -F":" '{print $1,$3}'  /etc/passwd   

// $1与$3之间手动添加空格分隔
$ awk -F":" '{print $1 " " $3}'  /etc/passwd         

// 自定义输出
$ awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd 

// 显示每行有多少字段
$ awk -F: '{print NF}' /etc/passwd 

// 将每行第NF个字段的值打印出来
$ awk -F: '{print $NF}' /etc/passwd   

//显示只有4个字段的行
$ awk -F: 'NF==4 {print }' /etc/passwd 

//显示每行字段数量大于2的行
$ awk -F: 'NF>2{print $0}' /etc/passwd  

//输出每行的行号
$ awk '{print NR,$0}' /etc/passwd      

//依次打印行号,字段数,最后字段值,制表符,每行内容
$ awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd 

//显示第5行
$ awk -F: 'NR==5{print}'  /etc/passwd  

//显示第5行和第6行
$ awk -F: 'NR==5 || NR==6{print}'  /etc/passwd    

//不显示第一行
$ route -n|awk 'NR!=1{print}'

1.2sed命令

sed  [选项]   '操作'   参数

sed  [选项]  -f scriptfile 参数

sed命令选项注释

-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件

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

-h或--help:显示帮助

-n、-quite或silent:表示仅表示处理后的结果

-i:直接编辑文本文件

sed命令示例

#输出第三行内容

sed -n '3p'  ens33  

#输出3-5行内容

sed -n '3,5p' ens33  

#输出第三和第五行

sed -n '3p;5p' ens33  

#输出所有奇数行     sed -n '1~2p' ens33也可以实现

sed -n 'p;n'  ens33  

#输出所有偶数行  sed -n '2~2p' ens33也可以实现

sed -n 'n;p'  ens33 

#输出1-5行的奇数行

 sed -n '1,5{p;n}'  ens33 

 #输出1-5的偶数行

sed -n '1,5{2~2p}' ens33 

#输出7行以后的偶数行

sed -n  '7,${n;p}'  ens33 

#从第3行开始,连续进行输出即输出3-8行的内容

sed -n '3,+5p' ens33 

##结合正则表达式使用

#输出包含the的行 

sed -n '/the/p' test.txt

#输出从第四行开始包含the的行

sed -n '4,/the/p' test.txt 

#输出包含the的行所在的行号,用(=)来输出行号

sed -n '/the/=' test.txt  

#输出PI开头的行

sed -n '/^PI/p' test.txt 

#输出以数字0-9为结尾的行

sed -n '/[0-9]$/p' test.txt 

#删除以.结尾的行

sed '/\.$/d' test.txt 

#删除空行

sed '/^$/d' test.txt

#将每行的第二个l替换为L

sed ‘s/l/L/2’

#将所有的o都替换为空字符

sed 's/o/ /g' test.txt   

1.3grep命令

grep格式

grep 参数 关键词 文件名

 grep选项参数注释

-c :只输出匹配模式的行数。
-h :只显示匹配的行,不显示文件名。
-i :忽略匹配时的大小写。
-l :只显示文件名列表。
-n :显示匹配的行及其行号。
-r :显示文件所在目录即路径。
-v :输出所有不匹配的行。


-e exp : 指定该选项的表达式,可以多次使用。
-f file :指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-E :将样式为延伸的正则表达式来使用。
-w :匹配整个单词。
-r :明确要求搜索子目录。
-d skip :忽略子目录。
-o :只打印匹配行的匹配部分,每个这样的部分在单独的输出行上。


\ :忽略正则表达式中特殊字符的原有含义。
[ ]:单个字符,如[A]即A符合要求。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。
.:所有的单个字符。
*:所有字符,长度可以为0。


-A n : 除了显示符合范本样式的那一行之外,并显示该行之后n行。
-B n : 除了显示符合范本样式的那一行之外,并显示该行之前n行。
-C n : 除了显示符合范本样式的那一行之外,并显示该行之前以及之后n行。

grep示例

#查找文件abc.txt中包含字符串"hello"的所有行

grep "hello" abc.txt

常用正则表达式介绍

^:匹配行的开头

$:匹配行的结尾

.:匹配任意字符

*:匹配前面的字符0次或多次

+:匹配前面的字符1次或多次

?:匹配前面的字符0次或1次

[]:匹配中括号中的任意一个字符

[^]:匹配不在中括号中的任意一个字符

#查找文件abc.txt中以"hello"开头的所有行

grep "^hello" abc.txt

#查看匹配行的上下文,可以使用-A、-B和-C选项来指定显示匹配行的后几行、前几行或前后几行。

#要查找文件abc.txt中包含字符串"hello"的行以及它的后两行

grep -A 2 "hello" abc.txt

#grep -n输出时显示行号: 显示匹配行的文件及行号。

grep -n "abc" abc.txt

##[abc]中括号:中括号表达式,[abc]表示匹配中括号中任意一个字符, a或b或c,常见的形式如下:

[a-z]匹配所有小写单个字母[A-Z]匹配所有单个大写字母
[a-zA-Z]匹配所有的单个大小写字母
[0-9]匹配所有单个数字
[a-zA-ZO-9]匹配所有数字和字母

1.4lsof命令

1.1grep命令格式

lsof 选项 文件名

1.2grep选项参数注释

-p pid : 输出指定进程打开的文件;

-l : 输出中使用ID代替用户名;

-u userName : 输出指定用户打开的文件;

-c string : 输出 COMMAND 列中包含 string 的项;

-d fd : 输出包含指定描述符的项;

fileName : 输出打开文件 fileName 的所有项;

1.3lsof实例使用

#列出所有打开的文件:
lsof
备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

# 查看谁正在使用某个文件
lsof   /filepath/file

#递归查看某个目录的文件信息
lsof +D /filepath/filepath2/
备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

# 比使用+D选项,遍历查看某个目录的所有文件信息 的方法
lsof | grep ‘/filepath/filepath2/’

# 列出某个用户打开的文件信息
lsof  -u username
备注: -u 选项,u其实是user的缩写

# 列出某个程序所打开的文件信息
lsof -c mysql
备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成lsof | grep mysql,但是第一种方法明显比第二种方法要少打几个字符了

# 列出多个程序多打开的文件信息
lsof -c mysql -c apache

# 列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql

# 列出除了某个用户外的被打开的文件信息
lsof   -u ^root
备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

# 通过某个进程号显示该进行打开的文件
lsof -p 1

# 列出多个进程号对应的文件信息
lsof -p 123,456,789

# 列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1

# 列出所有的网络连接
lsof -i

# 列出所有tcp 网络连接信息
lsof  -i tcp

# 列出所有udp网络连接信息
lsof  -i udp

# 列出谁在使用某个端口
lsof -i :3306

# 列出谁在使用某个特定的udp端口
lsof -i udp:55

# 特定的tcp端口
lsof -i tcp:80

# 列出某个用户的所有活跃的网络端口
lsof  -a -u test -i

# 列出所有网络文件系统
lsof -N

#域名socket文件
lsof -u

#某个用户组所打开的文件信息
lsof -g 5555

# 根据文件描述列出对应的文件信息
lsof -d description(like 2)

# 根据文件描述范围列出文件信息
lsof -d 2-3

1.4(lsof)命令输出各项注释

COMMAND : 命令名称;

PID : 进程ID;

TID : 线程ID,如果为空代表列出的是进程;

TASKCMD : 任务名称,通常与 COMMAND 相同;

USER : 用户ID号或登录名;

FD : 文件描述符;

TYPE : 与文件关联结点的类型;

DEVICE : 设备号;

SIZE/OFF : 文件大小/偏移量,以字节为单位;

NODE : 文件结点;

NAME : 文件挂载点和文件所在的系统;

1.5tcpdump命令(重点)

1.1tcpdump定义

tcpdump是一个用于截取网络分组,并输出分组内容的工具,转包分析软件。

1.2tcpdump格式

tcpdump [协议类型] [源或目标] [主机名称或IP] [or/and/not/!条件组合] [源或目标] [主机名或IP] [or/and/not/!条件组合] [端口] [端口号] …… [or/and/not/!条件组合] [条件]

1.3选项参数注释

-a #将网络地址和广播地址转变成名字
-A #以ASCII格式打印出所有分组,并将链路层的头最小化
-b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
-c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump
-d #将匹配信息包的代码以人们能够理解的汇编格式输出
-dd  #将匹配信息包的代码以c语言程序段的格式输出
-ddd #将匹配信息包的代码以十进制的形式输出
-D #打印系统中所有可以监控的网络接口
-e #在输出行打印出数据链路层的头部信息
-f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
-F #从指定的文件中读取表达式,忽略其他的表达式
-i #指定监听网络接口
-l #使标准输出变为缓冲形式,可以数据导出到文件
-L #列出网络接口已知的数据链路
-n #不把网络地址转换为名字
-N 不输出主机名中的域名部分,例如www.baidu.com只输出www
-nn #不进行端口名称的转换
-P #不将网络接口设置为混杂模式
-q #快速输出,即只输出较少的协议信息
-r #从指定的文件中读取数据,一般是-w保存的文件
-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
-s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
-S #将tcp的序列号以绝对值形式输出,而不是相对值
-T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
-t #在输出的每一行不打印时间戳
-tt #在每一行中输出非格式化的时间戳
-ttt #输出本行和前面以后之间的时间差
-tttt #在每一行中输出data处理的默认格式的时间戳
-u #输出未解码的NFS句柄
-v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv#输出相信的保报文信息

1.4tcpdump实例使用

#默认监听在第一块网卡,监听所有经过此网卡的数据包

tcpdump

#监听指定网卡ens33的所有传输数据包 

tcpdump  -i  ens33

#监听指定的主机

tcpdump -i eth0 -nn 'host 192.168.10.1'

#监听指定端口

tcpdump -i eth0 -nnA 'port 80'

#抓取特定目标ip和端口的包

tcpdump host 192.168.10.1 and tcp port 8080

#抓取所有经过 eth0,目的端口是 22 的网络数据

tcpdump -i eth0 dst port 22

#抓取所有经过 eth0,目的地址是 192.168.10.10 或 192.168.10.20 端口是 80 的 TCP 数据
tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 192.168.10.00) or (dst host 192.168.10.20)))'

#抓取所有经过 eth1,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

#抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.10.200的 TCP 数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.10.20)))'

###显示所有已建立的连接,使用netstat命令

netstat -a | grep ESTABLISHED

###显示所有处于侦听状态的TCP连接

netstat -a | grep tcp | grep LISTEN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学技术oH

你的鼓励是一起学习的动力何阶梯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值