2:数据和提取

Mail

新的小插件 tldr tldr简化了烦琐的man的输出帮助信息,只列出关键的语法信息、例子,方便用户使用。

npm install -g tldr

vim 的语法 ^$: 行首 行尾

替换的命令 :%s


目录

cut 切分

grep 检索 [-acinv] <string> <file>

SORT 排序

uniq 去重

插入awk

split 文件切分

tr 替换、压缩和删除

grep 检索 [-acinv] <string> <file>

WC 统计

TEE 双向重导项

XARGS 参数代换

文本替换


文本替换

%s/\text/替换的内容 /[全局替换]/g

cut 切分

cut 是以每一行为一个处理对象的 这种机制和 sed 命令一样。 作用剪切数据

将每个文件中选定的行部分打印到标准输出。

长选项的强制参数对于短选项也是强制的。

-b、 --字节=列表

仅选择这些字节

-c、 --字符=列表

仅选择这些字符

-d、 --分隔符=DELIM

字段分隔符使用DELIM而不是TAB

-f、 --字段=列表

仅选择这些字段;还可以打印任何不包含分隔符的行,除非指定了-s选项

-带-b的n:不拆分多字节字符

--补足

补充所选字节、字符或字段集

-s、 --仅限分隔符

不打印不包含分隔符的行

--输出分隔符=字符串

使用字符串作为输出分隔符默认情况下使用输入分隔符

example

echo ${PATH}   
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
echo ${PATH} | cut -d "/" -f 2

grep 检索 [-acinv] <string> <file>

grep搜索命名的输入文件,如果没有命名文件或者如果文件名中给出了一个连字符减号(-),则搜索标准输入以查找包含与给定模式匹配的行。通过默认情况下,grep打印匹配的行。

grep -n 按照顺序输出行号

grep -n main 1.c  
grep -n "main" *  --全部

grep -v 反向查找 (输出没有找到的) —not in

 last | grep -v "xxx"  

按照用户查看 cat /etc/passwd 用户 并且读到sync 用户结束

cat /etc/passwd | cut -d : -f 1 | xargs -n 1 -enync id

SORT 排序

sort [-fbMnrtuk] <file_or_stdio>

-f:忽略⼤小写

-b:忽略最前面的空格符

-M:以月份名称排序

-n:以纯数字⽅式排序

-r: 反向排序

cat /etc/passwd | sort -t : -k 3 -n -r

-u:uniq

-t:分割符,默认[TAB]

-k: 以那个区间排序

cat /etc/passwd | sort -t : -k 3 -n  

cat /etc/passwd  | sort -t: -k 3 -n -- 按数字排序  -第三列 -t 按分隔符分割

WC 统计

WC 统计字符,字数,行数

Øwc [-lwm] <file_or_stdin>

Ø-l:仅列出⾏号

Ø-w:仅列出多少字

Ø-m:仅列出多少字符

last | grep -v "root" |grep -v "^$" |cut -d " " -f 1|sort -u

统计去重后的总数

last | grep -v "root" |grep -v "^$" |cut -d " " -f 1|uniq -c

统计登录的总数

last | grep -v "^$" |grep -v "wtmp" |grep "boot" |wc -l 

主机中本地登录的用户名,按照次数排序,并且输出次数

last | grep -v "^$" |grep -v "wtmp" |grep "boot" |awk '{print $1}' |  wc -c
last | grep -v "^$" |grep -v "wtmp" |grep "boot" |awk '{print $1}' | uniq -c
last | grep -v "^$" |grep -v "wtmp" |grep "boot" |awk '{print $1}' | uniq -c |sort -n -r

我只有单个用户没有效果

取区间 的10个用户 通过cut 剪切出-d : -f

 cat /etc/passwd |head -n 20 |tail -n  1

单独的用户 cut -d 为分割付 ,-f为 第一列头

cat /etc/passwd |head -n 20 |tail -n  10| cut -d : -f 1

参数替换了

uniq 去重

uniq [-ic]

-i:忽略⼤小写字符的不同

-c:进⾏计数

last | grep -v "root" |grep -v "^$" |cut -d " " -f 1|uniq -c

插入awk

last | grep -v "root" |grep -v "^$" |cut -d " " -f 1|uniq -c |sort -n -r | awk '{printf("%s %d\n",$2 ,$1)}'

嵌入含C 语言的函数

awk '{printf("%s %d\n",$2 ,$1)}'

TEE 双向重导项

重定向到1.log 1.log 则显示1.c 的显示的所有数据

cat 1.c | tee 1.log

split 文件切分

-l num:以num⾏为⼤小切分 ||拆分文件,每个拆分有10行

split -l 10 filename

example >ls /etc/ |split -l 10   rm x??

在每个拆分中拆分512字节的文件

split -b 512 filename

shell

XARGS 参数代换

xargs [-0pne] <command>

-0:将特殊字符还原为普通字符

-eEOF:当xargs读到EOF时停⽌

-p:执⾏指令前询问

-n num:每次执⾏command时需要的参数个数

echo  "root" | xargs -n 1 -ezrx  [-p] 为询问

.参数替换 10 个到20 个id 展现了

cat /etc/passwd |head -n 20 |tail -n  10| cut -d : -f 1 | xargs -n 1 id

tr 替换、压缩和删除

tldr tr

tr -s 压缩

tr -c

替换 —将第一个集合的每个字符映射到第二个集合的相应字符 1 对应替换

example—> tr 'abcd' 'jkmn' < filename

tr 'inclue' 'aaaa' < 1.log

tr -d 'input_characters' < filename

从输入中删除指定字符集的所有匹配项

tr -d 'inclue' < 1.log

将一系列相同的字符压缩为单个字符:

tr -s 'input_characters' < filename

cat 1.c |tr -d 'include' | tr -s  ' '

小写换成大写 -大写换小写

tr "[:lower:]" "[:upper:]" < 1.log

本地的etc 目录下的文件及目录,每十条保存到一个文件中

tail -1 参数为行数

— 显示文件中最后的“count”行

rev 字符串颠倒

思考题目:

 "1 2 3 4 5 6 7 9 a v 你好 ./8"

bash 计算 $[ ]

echo "1 2 3 4 5 6 7 9 a v 你好 ./8" |tr -s -c "0-9" " "
echo "1 2 3 4 5 6 7 9 a v 你好 ./8" |tr -s -c "0-9" " "| echo $[`tr " " "+"` 0]

常用符号:cat>> 正向读 <<作为输入提供

a.txt | tr ""  "\n" | sort | uniq -c | sort -n -r 

AWK文本数据处理 <要点

可以传C语言 传入参数

cat /etc/passwd | awk -F: -v SUM=${SUM} -v cnt=${cnt} 'BEGIN {printf("Hi \n")}'
cat /etc/passwd | awk -F: -v SUM=${SUM} -v cnt=${cnt} 'BEGIN {printf("Hi \n")} {if($3<100){printf("cnt=%d,name=%s,id=%d",++cnt,$1,$3);sum+=$3; printf("sum=%d\n",sum)}} '

传出参数eval

测试

cat /etc/passwd | awk -F: -v SUM=${SUM} -v cnt=${cnt} '{if($3<100){++cnt; sum+=$3;}} END {printf("sum=%d \n avg=%d\n",sum,sum/cnt)}'

将参数传出

END的计算完成后的参数都可以传出

eval  ` cat /etc/passwd | awk -F: -v SUM=${SUM} -v cnt=${cnt} '{if($3<100){++cnt; sum+=$3;}} 
END {printf("sum=%d \n avg=%d\n",sum,sum/cnt)}'`
 
posted @ 2022-06-29 14:08  Aquiet  阅读(47)  评论(0编辑  收藏  举报