Linux三剑客

date
Feb 24, 2024
slug
linux
status
Published
tags
BasicSkill
summary
type
Post

bash

  • 命令展开
    • echo kkkk{1..100..2} //1-100所有奇数前缀是kkkk echo kkkk{01..100} //1-100 001,002,...,100 前缀是kkkk
  • 命令别名
    • alias xx='xxxxx'unalias xx
  • 命令历史
    • history!! //上一次 !行号
  • 快捷键
    • ctrl + a //行首 ctrl + e //行尾 ctrl + u //删除光标之前的字符 ctrl + k //删除光标之后的字符

RegExp

这是个令人头疼的东西(
  • 基本正则 BRE
  • 扩展正则 ERE
在Linux中仅受三剑客支持

基本正则表达式BRE集合

  • 匹配字符
  • 匹配次数
  • 位置锚定
符号
作用
^
用于模式的最左侧,如”^oldguy”,匹配以oldguy单词开头的行
$
用于模式的最右侧,如”oldguy$",匹配以oldguy单词结尾的行 | | ^$
.
匹配任意一个字符
\
转义
*
匹配前一个字符0或多次
.*
匹配所有内容
^.*
匹配任意多个字符开头的内容
.*$
匹配任意多个字符结尾的内容
[abc]
匹配[]内的任意一个字符,也可以写成[a-c]
[^abc]
匹配除了^后面的任意字符

扩展正则表达式ERE集合

必须用grep -E才能生效
字符
作用
+
匹配前一个字符1次或多次
[:/]+
匹配括号内的”:“或者”/“字符一次或多次
?
匹配前一个字符0或1次
|
表示或者,同时过滤多个字符串
()
分组过滤
a{n,m}
匹配前一个字符最少[n,m]次
a{n,}
匹配前一个字符[n,∞)次
a{n}
匹配前一个字符正好n次
a{,m}
匹配前一个字符[0,m]次

grep

语法:grep [options] [pattern]file 命令 参数 匹配模式 文件数据 -i:ignorecase,忽略字符的大小写; -o:仅显示匹配到的字符串本身; -v,--invert-match:显示不能被模式匹配到的行; -E:支持使用扩展的正则表达式元字符; -q,--quiet,--silent:靜默模式,即不输出任何信息;
参数选项
解释说明
-v
排除匹配结果(取反)
-n
显示匹配行与行号
-i
不区分大小写
-c
只统计匹配的行数
-E
扩展正则
–color==auto
为过滤结果添加颜色
-w
只匹配过滤的单词
-o
只输出匹配的内容
普通正则案例
grep "root|usr" /etc/passwd -n -v -igrep - E "^#|^$" /etc/passwd //过滤空行和注释行
扩展正则案例
  • +
    • grep -E "o+" /etc/passwd
  • ()
    • grep -E "good|glad" test.txt grep -E "g(oo|la)d" test.txt grep -E "(l..e).*\1" test.txt #分组向后引用grep -E "(l..e)(s..t).*\2.*\1" test.txt #这里 \1 和 \2 分别引用了第一(l..e)和第二个(s..)捕获组匹配的文本。
  • {n,m}&{n,}&{,m}
    • grep -E "k{n,m}" test.txt

sed

notion image
语法:
sed [选项] [sed内置命令字符] [输入文件]
选项:
参数选项
解释
-n
取消默认sed的输出,常与内置sed内置命令p一起使用
-i
直接将修改结果写入文件,不用-i修改的是内存数据
-e
多次编辑,不需要管道符
-r
支持正则
常用内置命令字符:
sed的内置命令字符
解释
a
append,对文本追加,在指定行后面加一行/多行文本
d
Delete,删除匹配行
i
insert,表示插入文本,在指定行前面加一行/多行文本
p
Print,打印匹配行的内容,通常p和-n一起用
s/正则/替换内容/g
匹配正则内容,然后替换内容(支持正则),g代表全局匹配(可选)
sed匹配范围:
范围
解释
空地址
全文处理
单地址
指定文件某一行
/pattern/
被模式匹配到的每一行
范围区间
10,20 十到二十行,10,+5 第十行开始向下五行,/pattern1/,/pattern2/
步长
12,表示第1、3、5、7、9行,22表示2、4、6、8、10行
案例:
  • 打印某几行
    • sed -n '2,3p' test.txt sed -n '2,+3p' test.txt
  • 模式匹配
    • sed '/root/d' test.txt -i #如果不加-i不会修改原文件,删除了含有root的行sed 's/My/I/g' test.txt -i #把所有My替换成Ised -e 's/My/I/g' -e 's/xxxx/xx/g' test.txt -i #-e表示批量
  • 增加/删除行
    • sed '2a My linux is good.' test.txt -ised '2i My linux is bad.\nhhhhh' test.txt -ised 'a -----------------" test.txt -i #在每一行后都加上"-----------------"
  • 提取ip信息
    • 假设ifconfig 第二行如下:
      inet 10.141.32.137 netmask 255.255.192.0 broadcast 10.141.63.255
      ifconfig eth0 | sed -n '2p' | sed 's/^.*inet//' | sed 's/netmask.*$//ifconfig eth0 | sed -ne '2s/^.*inet//g' -e '2s/net.*$//gp'# 两种方式等价,其实末尾的$没必要加

awk

这位更是重量级:sob:
语法:
awk [option] 'pattern[action]' file...
awk '{print $2}'没有使用参数和模式,$2表示输出文本的第二列,$0表示整行
awk默认空格为分隔符,多个空格识别为一个空格
awk按行处理文件
$NF表示当前分割的最后一列,倒数第二列可以写成$(NF-1)
awk内置变量
内置变量
解释
$n
指定分隔符后,当前记录的第n个字段
$0
完整的输入记录
FS
输入字段分隔符,默认是空格
NF
分隔后当前行一共有多少个字段
NR
当前记录数,行数
FNR
个文件分别计数的行号
OFS
输出字段分隔符,默认是空格
RS
输入记录分隔符(输入换行符)
ORS
输出记录分隔符(输出换行符)
FILENAME
当前文件名
ARGC
命令行参数的个数
ARGV
数组,保存的是命令行给定的各参数
更多内置变量可以用man手册查看
man awk
自定义输出内容
awk必须外层单引号,内层双引号,内置变量$1、$2不得添加双引号
awk '{print "第一列:"$1,"第二列:"$2,"第三列:"$3}' test.txt
awk参数
参数
解释
-F
指定分隔字段符
-v
定义或修改一个awk内部的变量
-f
从脚本文件中读取awk命令
awk案例
test.txt文件如下
sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin
  • 指定行
    • awk 'NR==5{print $0}' test.txt awk 'NR==3,NR==6{print NR,$0}' test.txt #3-6行 且打印行号
  • FS输入分隔符
    • awk -F ':' '{print $1,$NF}' /etc/passwd awk -v FS=':' '{print $1,$NF}' /etc/passwd
  • OFS输出分隔符
    • awk -F ':' -v OFS='\t' '{print $1,$NF}' /etc/passwd #输出分隔符改为\t
  • 处理多个文件显示行号(NR&FNR)
    • a.txt
      I am the first line of a.txt I am the second line of a.txt
      b.txt
      I am the first line of b.txt I am the second line of b.txt
      #NRawk '{print NR,$0}' a.txt b.txt
      输出:
      1 I am the first line of a.txt 2 I am the second line of a.txt 3 I am the first line of b.txt 4 I am the second line of b.txt
      #FNRawk '{print FNR,$0}' a.txt b.txt
      输出:
      1 I am the first line of a.txt 2 I am the second line of a.txt 1 I am the first line of b.txt 2 I am the second line of b.txt
  • RS&ORS
    • awk -v RS=' ' '{print NR,$0}' test.txt #按空格换行awk -v ORS='hhhhh' '{print NR,$0}' test.txt #每行结尾以hhhhh分隔
  • ARGV
    • awk 'BEGIN{print "this is an ARGV test"}{print ARGV[0],ARGV[1],ARGV[2]}' test1.txt test2.txt # ARGV[0] = "awk"# ARGV[1] = "test1.txt"# ARGV[2] = "test2.txt"
  • 自定义变量
    • awk -v myvariable='kksk' 'BEGIN{print "My variable is?",variable}'
  • awk格式化
    • printf需要指定format,不会自动换行
      符号
      含义
      %c
      显示字符的ASCII码
      %d/%i
      十进制整数;
      %e/%E
      科学计数法显示数值;
      %f
      显示浮点数
      %g/%G
      以科学计数法的格式或浮点数的格式显示数值
      %s
      显示字符串
      %u
      无符号整数
      %%
      显示%自身
      -
      左对齐;默认右对齐 例:printf “%-d”
      +
      显示数值符号例:printf “%+d”
      对passwd格式化
      awk -F ":" 'BEGIN{printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\n","用户名","密码","UID","GID","用户注释","用户家目录","用户使用的解释器"}{printf "%-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %-25s\t %s\n",$1,$2,$3,$4,$5,$6,$7}' /etc/passwd
  • awk模式pattern
    • 特殊的pattern: BEGIN和END
    • BEGIN模式是处理文本之前需要执行的操作
    • END模式是处理完所有行之后执行的操作
    • pattern也可以理解为条件
      awk的模式
      关系运算符
      解释
      示例
      <
      小于
      x<y
      <=
      小于等于
      x<=y
      ==
      等于
      x==y
      !=
      不等于
      x!=y
      >=
      大于等于
      x>=y
      >
      大于
      x>y
      ~
      匹配正则
      x~/正则/
      !~
      不匹配正则
      x!~/正则/
  • awk与正则表达式
    • 找出/etc/passwd/usr/bin/false的用户
      grep '/usr/bin/false' /etc/passwd awk '/\/usr\/bin\/false$/' /etc/passwd
      找出两个用户之间的内容
      awk '/^username1/,/^username2/ {print $0}' /etc/passwd
      查看nginx访问access.log中访问最频繁的十个ip
      awk '{print $1}' 500access.log |sort -n |uniq -c |sort -nr |head -10

小练习(没写捏)

  • grep
  • sed
  • awk
对于本文内容有任何疑问, 可与我联系.