(九)Shell工具:awk,sort,cut,sed
九、Shell工具
1. cut
cut:的工作就是剪,具体说就是从文件中剪切出想要的数据。
cut的原理:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
基本语法
cut [选项] filename
选项:
- -f:列号,提取第几列
- -d:分隔符,按照制定分隔符分割列,默认分隔符是制表符
案例实操
cut.txt如下
kivelson sang
valentina Son
david wang
zhimin liu
- 从cut.txt中剪切第2列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cut -f 2 -d " " cut.txt
sang
Son
wang
liu
- 从cut.txt中剪切第2列和第三列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cut -f 1,2,3 -d " " cut.txt
kivelson sang
valentina Son
david wang
zhimin liu
- 从cut.txt中剪切出kivelson
sangxiaoqian@MBP HelloShell % cat cut.txt | grep kivelson | cut -f 1 -d " "
kivelson
- 截取系统path变量值,第2个 ":" 后的所有路径
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % echo $PATH | cut -f 3- -d ":"
/bin:/usr/sbin:/sbin
- 切割ifconfig打印的ip地址
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether f4:d4:88:89:f6:ff
inet6 fe80::1892:2ecb:ef9f:d67f%en0 prefixlen 64 secured scopeid 0xf
inet 172.19.196.153 netmask 0xfffff000 broadcast 172.19.207.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -d " " -f 2
fe80::1892:2ecb:ef9f:d67f%en0
172.19.196.153
2. sed
sed是用于编辑文本内容的流编辑器,它一次只能处理一行内容。
原理:处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
基于语法
sed [选项参数] ”命令“ filename
: mac下用gsed代替sed
brew install gnu-sed
alias sed=gsed
选项 | 功能 |
---|---|
-e | 命令集模式 |
命令 | 功能 |
---|---|
a | 在下一行新增 |
d | 删除 |
s | 查找并替换 |
案例实操
cut.txt如下
kivelson sang
valentina Son
david wang
zhimin liu
wo wo
- 在Valentina Son下插入”mei lv“, 源文件不改变
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "2a mei lv" cut.txt
kivelson sang
valentina Son
mei lv
david wang
zhimin liu
- 删除sed.txt文件中所有包含wo的行
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "/wo/d" cut.txt
kivelson sang
valentina Son
david wang
zhimin liu
- 将cut.txt文件中wo替换为ni
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed "s/wo/ni/g" cut.txt
kivelson sang
valentina Son
david wang
zhimin liu
ni ni
g代表全局替换
- 将sed.txt文件中第二行删除, 并将wo替换我ni
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sed -e "2d" -e "s/wo/ni/g" cut.txt
kivelson sang
david wang
zhimin liu
ni ni
3. awk
awk是一个强大的文本分析工具,把文件逐行读入,以空格为默认分隔符将每行切片,再对切片进行分析处理。
awk[选项] 'pattern1{action1} pattern2{action2}...' filename
:
-
pattern: 正则表达式,用于在awk数据中查找内容。
-
action:在找到匹配内容时执行一系列命令。
-
选项:
选项 | 功能 |
---|---|
-F | 指定输入文件拆分分隔符 |
-v | 赋值一个用户定义变量 |
- 内置变量
变量 | 功能 |
---|---|
FILENAME | 文件名 |
NR | 已读的记录数(行号) |
NF | 切割后,列的个数 |
案例实操
拷贝/etc/passwd到当前目录,并改变文件所属用户为当前用户
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sudo cp /etc/passwd ./
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sudo chown sangxiaoqian:staff ./passwd
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % cat passwd
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false
_lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false
- 搜索passwd文件中,以root开头的所有行,并输出该行的第七列
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" '/^root/{print $7}' passwd
/bin/sh
- 搜索passwd文件中,以root开头的所有行,并输出该行的第1列和第7列,以,分隔(默认以宫格分隔)
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" '/^root/{print $1","$7}' passwd
root,/bin/sh
- 只显示/etc/passwd的第1列和第7列,以逗号分隔,在第1行前添加用户名,在最后一行后添加“hahaha”
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F ":" 'BEGIN{print "sangxiaoqian"} {print $1","$7} END{print "hahaha"}' passwd
username
nobody,/usr/bin/false
root,/bin/sh
daemon,/usr/bin/false
_uucp,/usr/sbin/uucico
_taskgated,/usr/bin/false
_networkd,/usr/bin/false
_installassistant,/usr/bin/false
_lp,/usr/bin/false
hahaha
- 将所有用户id+1,并输出
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : '{print $3+1}' myPass.txt
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : -v i=1 '{print $3+i}' myPass.txt
- 统计passwd文件名,每行的行号,每行的列数
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk -F : '{print NR" "FILENAME": "NF}' myPass.txt
1 myPass.txt: 7
2 myPass.txt: 7
3 myPass.txt: 7
4 myPass.txt: 7
5 myPass.txt: 7
6 myPass.txt: 7
- 切割IP
IP如下:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>
ether f4:d4:88:89:f6:ff
inet6 fe80::1892:2ecb:ef9f:d67f%en0 prefixlen 64 secured scopeid 0xf
inet 172.19.196.153 netmask 0xfffff000 broadcast 172.19.207.255
切割IP:
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -f 2 -d " " | sed "1d" | awk -F "." '{print $1,$2,$3,$4}'
172 19 196 153
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % ifconfig en0 | grep inet | cut -f 2 -d " " | sed "1d"
172.19.196.153
- 查询cut.txt中空行所在的行号
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % awk '/^$/{print NR}' cut.txt
4. sort——排序
sort (选项)(参数)
: 按照制定规则进行排序
选项 | 说明 |
---|---|
-n | 按照数值大小排序 |
-r | 按照相反顺序排序 |
-t | 列分隔字符 |
-k | 制定需要排序的列 |
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sort -t : -k 2 -nr sort.txt
xz:50:2.3
ss:30:1.6
bb:30:5.4
db:20:4.2
cls:10:3.5
sangxiaoqian@MBP-GDQ7F0673C-2307 HelloShell % sort -t : -k 2 -n sort.txt
cls:10:3.5
db:20:4.2
bb:30:5.4
ss:30:1.6
xz:50:2.3