Sed
读入一行数据,与编辑的命令匹配,修改数据再输出到 output
基本格式
sed options script file
-e 执行多个命令
-f 指定命令文件,其中命令无须“ ; ”分割
-n 禁止输出,直到遇到 p flag
eg: sed -e 's/xx/xx/; s/xxx/xxx' data # 使用 ; ,命令结尾与分号间无空格
sed 的命令
s, 默认仅替换首次出现的文本 s/pattern/replacement/flags
flags: g 替换全部; p 打印原始行,与 -n 结合以输出已修改行; w filename 结果写入到 filename ;数字,新文本替换的模式,如 2 表示替换第 2 处匹配
sed 中 / 用作转义, / 用作定界,也可选择其他字符如“ ! ”: sed 's!/bin/bash!/bin/csh!' /etc/passwd
d, 删除: sed '3,$d' data
p,
i, 指定行之前插入新行
a, 指定行之后附加新行,这两个命令必须单独指定要插入或附加的行
eg: sed '[address]command / # 必须使用 / 换行,多行则使用多个 /
new line'
line addressing 行寻址
使 sed 作用于特定行:
1) 指定行号方式,首行行号为 1 , $ 表示尾行: sed '2,$s/dog/cat/' data1
2) 指定匹配模式方式, /pattern/command : sed /'ri*/s/dog/cat/' data1
指定多个模式,使用“ , ”分隔: sed '/1/,/3/d' data # sed 在匹配模式 /1/ 时打开删除,直到匹配到模式 /3/ 时关闭删除
组合命令,对同一行执行多个命令:
sed '2{s/dog/cat/; s/aaa/bbb/' data
sed 通常只处理单行文本,将成为处理跨行短语的限制,使用 N 、 D 、 P 等命令
gawk
基本格式
gawk options program file
-F fs ,指定用作数据分段的文件分隔符 field seperation character
-f file ,指定程序文件名
-v var=value ,变量和默认值
-mf N ,要处理的字段的最大数目
-mr N ,最大记录大小
-W keyword ,兼容模式或告警级别
gawk 脚本由 {} 定义,必须放在单引号内, gawk 假定脚本为单文本字串
变量: $0 整行文本, $1 第一个字段
eg: gawk -F: '{print $1}' /etc/passwd
多个命令,使用分号分开: gawk '{$1="xxx"; print $0}' # 可赋值,使用“ ; ”分割多个命令
从文件读取程序:
文件内容: {print $5 "'s userid is " $1};
$gawk -F: -f script /etc/passwd
脚本文件: script
{
text="'s userid is " #无须;
print $5 test $1 #变量的使用无须 $
}
处理数据前 / 后运行脚本 BEGIN/END
eg:
echo adfdfadf|gawk 'BEGIN{print "begin:"}{print $0}END{print "end"}'
变量:
1 ) FIELDWIDTHS :用空格定义每个数据字段的精确宽度,设置后将忽略 FS , eg: 'BEGIN{FIELDWIDTHS="2 3 1"}'
2 ) FS 变量,指定字段分隔符, eg: gawk 'BEGIN{FS=":"}'
3 ) RS ,指定记录的分隔符,默认为换行
4 ) OFS ,输出字段的分隔符
5 ) ORS ,输出记录的分隔符,默认为换行
6 )使用环境变量, ENVIRON [“ HOME ”],可使用任意环境变量
7 ) NF ,数据字段个数, $NF 最后一个数据字段
8 ) FNR ,(当前文件的)当前记录号,
9 ) NR ,已处理记录个数
使用正则表达式
必须出现在脚本的左括号前,用于匹配任何字段符合该模式的记录——这样也可以使用 gawk 来直接定位行,无须 sed ?
eg:gawk 'BEGIN{FS=","}/11/{print $1}' data1
matching operator ,使正则表达式匹配特定字段
eg:gawk '$2~/11/{print $0}' data1
否定匹配,使用 !:
eg:gawk '$2!~/11/{print $0}' data1
使用数学表达式匹配,判断符号包括 == <= < >= > :
eg: '$4==0{print $0}' # 不能用于字符
格式化输出
printf "format string",var1,var2...
eg: printf "result is %d/n",x # 不会自动换行,所以需要 /n
格式化控制符同 c 语音,包括 c/d/e/f/s/x 等
内置函数
eg:
gawk '{x="aasf";print toupper(x)}' data