bash命令常用功能
字符处理
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 批量前缀指定 ni9ne@ni9nes:~$ echo naxx{111,123,1112} naxx111 naxx123 naxx1112 # 连续补全后缀 ni9ne@ni9nes:~$ echo naxx{1..10} naxx1 naxx2 naxx3 naxx4 naxx5 naxx6 naxx7 naxx8 naxx9 naxx10 # 指定步长补全后缀 ni9ne@ni9nes:~$ echo naxx{1..10..2} naxx1 naxx3 naxx5 naxx7 naxx9 # 指定格式补全后缀 ni9ne@ni9nes:~$ echo naxx{001..10..2} naxx001 naxx003 naxx005 naxx007 naxx009
|
命令行快捷键
1 2 3 4 5
| Ctrl + a 移动光标到命令首字符 Ctrl + e 移动光标到命令末尾字符 Ctrl + u 删除光标之前的字符 Ctrl + k 删除光标之后的字符 Ctrl + l 清屏,相当于命令clear
|
正则表达式
regular expression - REGEXP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 基本正则表达式 BRE Basic Regular Expression - 包括字符: ^ - 匹配以指定字符开头, 如 "^nax" 表示匹配以'nax'开头的行 $ - 匹配以指定字符结尾, 如 "axx$" 表示匹配以'axx'结尾的行 . - 匹配任意一个字符 [] - 匹配中括号内任意一个字符, 如 "[abc]" 表示匹配a或b或c * - 匹配前一个字符出现任意次,0次或多次 [^abc] - 匹配除了^后出现的任意字符, ^在中括号内代表取反 扩展正则表达式 ERE Extended Regular Expression 扩展正则需要用grep -E 搭配才能使用 - 包括字符: () - 分组过滤,将括号内的字符当做一个整体,如"g(oo|la)d"代表good或glad 后可以使用\n 引用第n个括号内内容 {} - 匹配前一个字符指定次数 {n,m} - 最少n次,最大m次 {n,} - 最少n次 {,m} - 最多m次 {n} - 正好n次 ? - 匹配前一个字符0次或一次 + - 匹配前一个字符一次或多次 | 或者,同时过滤多个字符串
|
主要用于处理大量字符串, 过滤替换处理
linux工具
grep - 文本过滤工具
sed - 流编辑器
awk - 格式化文本报告生成器
grep
global search regular expression and print out the line
文本搜索工具, 根据用户指定的模式逐行匹配目标文本, 打印匹配的行
1 2 3 4 5 6 7 8 9 10
| grep [OPTION]... PATTERN [FILE]... Search for PATTERN in each FILE. Example: grep -i 'hello world' menu.h main.c -i --ignore-case 忽略字符大小写 -o --only-matching 仅显示匹配到的字符串本身而不是整行 -v --invert-match 显示未被匹配到的行 -E --extended-regexp 支持扩展正则 -q --quiet 不输出任何匹配信息 -n 显示行号 -c 仅统计匹配行数
|
1 2 3 4
| # 排除所有空行 grep '^$' passwd.txt -v # 排除所有空行和注释行 grep '^$' passwd.txt -v | grep '^#' passwd.txt -v
|
sed
Stream Editor 字符流编辑器
用于操作、过滤、转换文本内容的工具, 常用于过滤指定字符串, 取出指定行数据等

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| sed [OPTION]... {script-only-if-no-other-script} [input-file]... 选项 内置命令字符 输入文件 选项参数: -n 取消默认输出(默认输出全部,包括未匹配与匹配到的行), 一般与命令字符p一起用 -i 将修改结果写入文件,不用-i是修改sed内存数据 -e 多次编辑,免用管道符 -r 支持扩展正则模式 内置命令字符参数: a append,追加文本,在指定行后添加文本内容 i insert,插入文本,在指定行之前插入文本内容 d delete,删除匹配文本行 p print,打印匹配行内容,通常与选项-n一起使用 s/匹配正则/替换内容/g 匹配内容并替换(支持正则),g代表全局替换 匹配范围参数: 空地址 全文处理 单地址 指定文件某一行 /pattern/ 匹配到的每一行 范围区间 10,20 - 10到20行全部 | 10,+5 - 从第十行起向下5步 | /pattern1/,/pattern2/ 步长 1~2 - 从一开始,两步一跳,即1,3,5,7... | 2~2 - 从二开始,两步一跳,即2,4,6,...
|
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # 输出测试文件第2,3行内容 sed -n '2,4p' passwd.txt # 取消默认输出,仅打印2到4行 # 过滤出含有ni9ne字符串的行 sed -n '/ni9ne/p' passwd.txt # 删除含有root的行 sed '/root/d' passwd.txt # 仅显示删除后文本的剩余内容 sed -i '/root/d' passwd.txt # 加-i参数后直接修改文件,无回显 # 替换文件中的ni9ne为user09 sed -i 's/ni9ne/user09/g' passwd.txt # 无回显 # 替换文件中的ni9ne为user09,同时替换root为naxx sed -i -e 's/ni9ne/user09/g' -e 's/root/naxx/g'passwd.txt # 在文件第二行追加字符 game:x:1000:33:game:/home/game:/bin/bash sed -i '2a game:x:1000:33:game:/home/game:/bin/bash' passwd.txt # 在文件首行插入多行字符 sed -i '1i root1 \n root2' passwd.txt # 多行数据用\n隔开即可 # 在每行文本下添加分隔符 ---- sed -i 'a -----------' passwd.txt # 空地址代表全文处理 # 为前五行数据添加分隔符--- sed -i '1,5a ------' passwd.txt
|
使用sed取出linux的IP地址
1 2 3
| ifconfig ens33 | sed -n '2p' | sed 's/^.*inet //' | sed 's/ netmask.*$//' 或者 ifconfig ens33 | sed -n -e '2s/^.*inet //' -e '2s/ netmask.*$//p'
|
awk
拥有强大的文本格式化能力, 可以将文本数据格式化成对应格式输出或显示
1 2 3 4 5 6
| awk [option] 'pattern[action]' file ... 选项 模式/动作条件 文件 如: awk '{print $2}' passwd.txt #表示打印以空格分隔符的第二行数据 - awk中默认以空格作为分隔符, 且多个空格识别为单个空格 - awk默认按行处理文件 - $0代表所有行, $n代表第n列数据, $NF代表最后一列,倒数第二列可以写为$(NF-1)
|
1 2 3 4
| awk选项参数 -F 指定字段分隔符 -v 定义或修改awk内部变量 -f 从脚本文件中读取awk命令
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| awk内置变量 - $n 指定分隔符分隔的第n列 - $0 所有列,完整的列数据 - FS(field_separator) 字段分隔符, 默认为空格 - NF(number_of_fields) 分隔后的字段总个数 - NR(number_of_records) 记录行总行数 - RS(record_separator) 记录行分隔符, 默认为换行符 - OFS(output_field_separator) 输出字段分隔符, 默认为空格 - ORS(output_record_separator) 输出记录行分隔符, 默认为换行符 - FNR 各文件分别计数行号 - FILENAME 当前处理文件名 - ARGC 命令行参数个数 - ARGV 数组,保存命令行给定参数 awk自定义变量
|
自定义输出内容时, 必须外层单引号, 内层双引号, 变量$1,$2 不可以添加双引号, 否则会识别为文本
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| # 输出整行信息 awk '{print}' passwd.txt awk '{print $0}' passwd.txt # 输出第1,2列和倒数第二列数据 awk '{print $1,"------",$2,"------",$(NF-1)}' passwd.txt # 输出文件第五行数据 awk 'NR==5' passwd.txt # =是给变量赋值, ==表示判断符 # 输出文件第二到第五行数据 awk 'NR==2,NR==5' passwd.txt # 输出第2行和第五行的内容 awk 'NR==2||NR==5{print $0}' passwd.txt # 输出第二到第五行的第1,2列数据 awk 'NR==2,NR==5{print $1,$2}' passwd.txt # 输出所有数据并添加行号 awk '{print NR,$0}' passwd.txt # 输出以:分隔的passwd文件为以----或制表符为分隔符 awk -F ":" -v OFS="----" '{print $1,$NF}' passwd.txt awk -v FS=":" -v OFS="\t" '{print $1,$NF}' passwd.txt # 处理多个文件显示行号 awk '{print FNR,$0}' passwd.txt spasswd.txt
|
使用awk取出IP地址
1
| ifconfig ens33 | awk 'NR==2{print $2}'
|