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
语法:
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
- BEGIN模式是处理文本之前需要执行的操作
- END模式是处理完所有行之后执行的操作
特殊的pattern: 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