乱读天书, 不求甚解
周祎骏的个人云笔记
Toggle navigation
乱读天书, 不求甚解
主页
Linux:系统配置
Linux:用户管理
Linux:优化排错
Linux:进程调度
Linux:文件系统
Linux:网络
Linux:系统服务
Linux:安全
Linux:内核
容器:Docker
容器:containerd
容器编排:Kubernetes
IAC:Terraform
大数据:Hadoop
大数据:Zookeeper
大数据:Hbase
消息队列:rsyslog
消息队列:kafka
数据库:MySQL
数据库:MongoDB
搜索引擎:Elasticsearch
时序数据库:OpenTSDB
网站服务:Nginx
编程:Bash
编程:Perl
编程:Python
编程:C
编程:JAVA
编程:Rust
版本控制:gitlab
知识管理:docusaurus
常用小工具
关于我
标签
bash 0.5 处理文本
2016-04-15 14:55:58
103
0
0
admin
# 正则表达式 ## bash特殊符号: \ 转义,取消字符的特殊意义 ^ 字符串开头 \$ 字符串结尾 . 一个任意字符 \* 0到无数个任意字符 [a-c0-3G] a或b或c 或 0或1或2或3 或G [^a-c0-3G] 不是 a或b或c 或 0或1或2或3 或G [a-z]\\{2,3\\} 2到3个小写字母 [a-z]+ 1个或多个小写字母 (abc)? 0个或1个abc ()括起来的是群组 (a|b) a或b [:alnum:] 0-9,a-z,A-Z [:alpha:] a-z,A-Z [:blank:] 空格或tab [:cntrl:] 一些控制按键 [:digit:] 代表数字 [:graph:] 非空格或tab的所有 [:lower:] a-z [:upper:] A-Z [:print:] 可以被打印的字节 [:punct:] 各种标点符号 [:space:] 任何会产生空白的字符 [:xdigit:] 代表16进制数据 0-9,A-F,a-f ## 正则表达是抓取内容 ```bash #!/bin/bash ip=1.2.3.4 if [[ "$ip" =~ ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ]];then echo match echo ${BASH_REMATCH[0]} echo ${BASH_REMATCH[1]} echo ${BASH_REMATCH[2]} echo ${BASH_REMATCH[3]} echo ${BASH_REMATCH[4]} fi ``` 运行结果: ``` match 1.2.3.4 1 2 3 4 ``` *** # 处理文本 ## tr ```bash -bash-4.1$ echo "abcd" | tr "dcba" "_2e3" # d=>_ c=>2 b=>2 a=>3 3e2_ -bash-4.1$ echo "abcd" | tr "a-z" "A-Z" #小写变大写 ABCD -bash-4.1$ cat /tmp/a | tr -d '\n' #多行变一行 ``` *** ## sed sed -i 直接改文件 sed -e 's/xx/xx/g' -e 's/xxx/xxx/g' 用-e 做多个操作 sed -r 使用正则表达式 ```bash [root@fs1 ~]# cat b #!/bin/bash echo haha exit 2 [root@fs1 ~]# sed '1,2s/./a/g' b #把1到2行的任意字符变成a aaaaaaaaaaa aaaaaaaaa exit 2 [root@fs1 ~]# sed '2,$s/./a/g' b #改2到最后行 #!/bin/bash aaaaaaaaa aaaaaa [root@fs1 ~]# ``` *** ## awk awk内置变量 ARGC 命令行参数个数 ARGV 命令行参数数组(一般ARGV[0] 是awk) ENVIRON["xxx"] 系统的环境变量 FILENAME awk读取的文件名 NR 已读的记录数 FNR 浏览文件的记录数(开新文件会清0) NF 浏览记录的列的个数 FS 设置输入"列"分隔符,等价于命令行 -F选项 OFS 输出"列"分隔符 RS 设置输入"行"分隔符,默认为"\n"(一行一行读) ORS 输出"行"分隔符 \$0 是整条记录 \$1表示当前行的第一列,$2表示当前行的第二个列。。。 ```bash [root@fs1 home]# head /etc/passwd > passwd [root@fs1 home]# awk -F ':' 'BEGIN{count=0;print "name,uid"}{ print $1 " " $3 " #filename:" FILENAME ",linenumber:" NR ",columns:" NF " " ; count=count+1; if ($3==0){print "He is root!"}; home[count]=$6;name[count]=$1} END{print "There is " count " user."; for(i=1;i<NR;i++){print name[i] " ~ " home[i]} }' passwd name,uid root 0 #filename:passwd,linenumber:1,columns:7 He is root! bin 1 #filename:passwd,linenumber:2,columns:7 daemon 2 #filename:passwd,linenumber:3,columns:7 adm 3 #filename:passwd,linenumber:4,columns:7 lp 4 #filename:passwd,linenumber:5,columns:7 sync 5 #filename:passwd,linenumber:6,columns:7 shutdown 6 #filename:passwd,linenumber:7,columns:7 halt 7 #filename:passwd,linenumber:8,columns:7 mail 8 #filename:passwd,linenumber:9,columns:7 uucp 10 #filename:passwd,linenumber:10,columns:7 There is 10 user. root ~ /root bin ~ /bin daemon ~ /sbin adm ~ /var/adm lp ~ /var/spool/lpd sync ~ /sbin shutdown ~ /sbin halt ~ /sbin mail ~ /var/spool/mail awk 中传递环境变量 # echo "lala" | awk -v haha="wawa" '{print $1 " " haha}' lala wawa ``` *** # 一些处理字符串的技巧 \${var#pattern} 从左开始将匹配的数据删除,非贪婪 \${var##pattern} 从左开始将匹配的数据删除,贪婪 \${var%pattern} 从右开始将匹配的数据删除,非贪婪 \${var%%pattern} 从右开始将匹配的数据删除,贪婪 ``` [root@test ~]# a="abcabcdedef" [root@test ~]# echo ${a#a*c} abcdedef [root@test ~]# echo ${a##a*c} dedef [root@test ~]# echo ${a%d*f} abcabcde [root@test ~]# echo ${a%%d*f} abcabc ``` \${var/pattern_old/pattern_new} 把从左开始第一个匹配pattern_old 的字符串替换成pattern_new \${var//pattern_old/pattern_new} 把匹配pattern_old 的全部字符串替换成pattern_new ``` [root@test ~]# a="abcdabcd" [root@test ~]# echo ${a/b/A} aAcdabcd [root@test ~]# echo ${a//b/A} aAcdaAcd [root@test ~]# echo ${a/[bc]/A} aAcdabcd [root@test ~]# echo ${a//[bc]/A} aAAdaAAd ``` *** # 一些处理变量的技巧 | bash |arg没有配置|arg配置为空值|arg为非空字符串| |----------------------|-----------|-------------|---------------| |var=\${arg-string} |var=string |var= |var=arg | |var=\${arg:-string} |var=string |var=string |var=arg | |var=\${arg+string} |var= |var=string |var=string | |var=\${arg:+string} |var= |var= |var=string | |var=\${arg?string} |报错string |var= |var=arg | |var=\${arg:?string} |报错string |报错string |var=arg | 以下不能用于位置变量 如\$1 \$2 | bash |arg没有配置 |arg配置为空值 |arg为非空字符串| |----------------------|---------------------|---------------------|---------------| |var=\${arg=string} |var=string;arg=string|var="";arg="" |var=arg;arg=arg| |var=\${arg:=string} |var=string;arg=string|var=string;arg=string|var=arg;arg=arg| *** ```bash var="string" cat << EOF #打印这些文字 example1 $var # $var 会被解释 EOF cat > ./a << EOF #将这些文字写进a文件 example1 $var EOF cat <<- EOF # 删除行开头的tab(不删除空格) example2 $var EOF cat << 'EOF' #不解释$var example3 $var EOF cat << \EOF #不解释$var example4 $var EOF : << EOF #这样写仅仅是备注 example5 JUST COMMIT EOF ```
上一篇:
bash 0.4 子方法
下一篇:
bash 0.6 一些bash的环境变量/特殊字符
文档导航