范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

linux下文本处理三剑客学习汇总grepsedawk

  grep: 命令主要对文本的(正则表达式)行基于模式进行过滤
  sed: stream editor,文本编辑工具
  awk: Linux上的实现gawk,文本报告生成器
  文本处理三剑客之 grep
  grep:  Global search REgular expression and Print out the line
  作用: 文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查;打印匹配到的行
  模式: 由正则表达式字符及文本字符所编写的过滤条件
  格式: grep [OPTIONS] PATTERN [FILE...]
  常见选项: --color=auto 对匹配到的文本着色显示 -m # 匹配#次后停止 -v 显示不被pattern匹配到的行 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后#行 -B # before, 前#行 -C # context, 前后各#行 -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ fifile -w 匹配整个单词 -E 使用ERE,相当于egrep -F 相当于fgrep,不支持正则表达式 -f fifile 根据模式文件处理 () 分组 后向引用:1, 2, ... | 或者 a|b #a或b C|cat #C或cat (C|c)at #Cat或cat grep [OPTIONS] PATTERN [FILE...]-r 递归目录,但不处理软链接 -R 递归目录,但处理软链接
  范例: grep root /etc/passwd grep "USER" /etc/passwd grep "USER" /etc/passwd grep whoami /etc/passwd
  范例: df | grep "^/dev/sd" |tr -s " " %|cut -d% -f5|sort -n|tail -1
  范例: [root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s " " : |cut -d: -f6|sort |uniq - c|sort -nr|head -n3       3 10.0.0.1       1 172.16.4.100       1 172.16.31.188
  范例: [root@centos8 ~]#grep -v "^#" /etc/profile | grep -v "^#39; [root@centos8 ~]#grep -v "^#|^#34; /etc/profile [root@centos8 ~]#grep -v "^(#|$)" /etc/profile  [root@centos8 ~]#grep -Ev "^(#|$)" /etc/profile [root@centos8 ~]#egrep -v "^(#|$)" /etc/profile [root@centos6 ~]#egrep -v "^(#|$)" /etc/httpd/conf/httpd.conf|wc -l
  范例: [root@centos8 ~]#grep -o "r..t" /etc/passwd root root root root r/ft rypt
  范例: [root@centos8 ~]#ifconfig | grep -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9] {1,3}"        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255        inet 172.16.0.123 netmask 255.255.0.0 broadcast 172.16.255.255        inet6 fe80::c11e:4792:7e77:12a4 prefixlen 64 scopeid 0x20        inet 127.0.0.1 netmask 255.0.0.0 [root@centos8 ~]#ifconfig | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255        inet 172.16.0.123 netmask 255.255.0.0 broadcast 172.16.255.255        inet6 fe80::c11e:4792:7e77:12a4 prefixlen 64 scopeid 0x20        inet 127.0.0.1 netmask 255.0.0.0 [root@centos8 ~]#ifconfig | grep -Eo "([0-9]{1,3}.){3}[0-9]{1,3}"|head -1 10.0.0.8 [root@centos8 ~]#cat regex.txt  ([0-9]{1,3}.){3}[0-9]{1,3} [root@centos8 ~]#ifconfig | grep -oEf regex.txt  10.0.0.8 255.255.255.0 10.0.0.255 9731947 127.0.0.1 255.0.0.0
  范例: [root@centos8 ~]#grep -E "root|bash" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin wang:x:1000:1000:wang:/home/wang:/bin/bash mage:x:1001:1001::/home/mage:/bin/bash xiaoming:x:1002:1002::/home/xiaoming:/bin/bash roob:x:1003:1003::/home/roob:/bin/bash [root@centos8 ~]#grep -e "root" -e "bash" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin wang:x:1000:1000:wang:/home/wang:/bin/bash mage:x:1001:1001::/home/mage:/bin/bash xiaoming:x:1002:1002::/home/xiaoming:/b
  范例: [root@centos8 ~]#grep -w root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@centos8 ~]#grep " mtu 1500        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255        inet6 fe80::20c:29ff:fe45:a8a1 prefixlen 64 scopeid 0x20        ether 00:0c:29:45:a8:a1 txqueuelen 1000 (Ethernet)        RX packets 89815 bytes 69267453 (66.0 MiB)        RX errors 0 dropped 0 overruns 0 frame 0        TX packets 115634 bytes 79827662 (76.1 MiB)        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0  [root@centos8 ~]#ifconfig eth0 | sed -n "2p"        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255          [root@centos8 ~]#sed -n "$p" /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin  [root@centos8 ~]#ifconfig eth0 |sed -n "/netmask/p"        inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255   [root@centos8 ~]#df | sed -n "/^/dev/sd/p" /dev/sda2      104806400 4872956  99933444   5% / /dev/sda3       52403200  398860  52004340   1% /data /dev/sda1         999320  848568     81940  92% /boot  [root@centos8 ~]#seq 10 | sed -n "3,6p" 3 4 5 6 [root@centos8 ~]#seq 10 | sed -n "3,+4p" 3 4 5 6 7  [root@centos8 ~]#seq 10 | sed -n "3,$p" 3 4 5 6 7 8 9 10   [root@centos8 ~]#seq 10 |sed -n "1~2p" 1 3 5 7 9  [root@centos8 ~]#seq 10 |sed -n "2~2p" 2 4 6 8 10 [root@centos8 ~]#seq 10 |sed   "1~2d" 2 4 6 8 10  [root@centos8 ~]#seq 10 |sed   "2~2d" 1 3 5 7 9 [root@centos8 ~]#sed -e "2d" -e "4d" seq.log 1 3 5 6 7 8 9 10 [root@centos8 ~]#sed "2d;4d" seq.log 1 3 5 6 7 8 9 10 [root@centos8 ~]#sed -i.orig "2d;4d" seq.log [root@centos8 ~]#cat seq.log.orig 1 2 3 4 5 6 7 8 9 10 [root@centos8 ~]#cat seq.log 1 3 5 6 7 8 9 10 [root@centos8 ~]#seq 10 > seq.log  [root@centos8 ~]#sed -i.orig "2d;4d" seq.log  [root@centos8 ~]#sed -i   "/^listen 9527/a listen 80  listen 8080"  /etc/httpd/conf/httpd.conf   #删除所有以#开头的行 [root@centos8 ~]#sed -i "/^#/d" fstab  #只显示非#开头的行 [root@centos8 ~]#sed -n "/^#/!p" fstab
  范例: sed "2p" /etc/passwd sed  -n "2p" /etc/passwd sed  -n "1,4p" /etc/passwd sed  -n "/root/p" /etc/passwd sed  -n "2,/root/p" /etc/passwd 从2行开始 sed  -n "/^$/=" file 显示空行行号 sed  -n  -e "/^$/p" -e "/^$/=" file Sed"/root/asuperman" /etc/passwd行后 sed "/root/isuperman" /etc/passwd 行前 sed "/root/csuperman" /etc/passwd 代替行 sed "/^$/d" file sed "1,10d"   file nl   /etc/passwd | sed "2,5d" nl   /etc/passwd | sed "2a tea" sed "s/test/mytest/g" example sed -n "s/root/&superman/p" /etc/passwd 单词后 sed -n "s/root/superman&/p" /etc/passwd 单词前 sed -e "s/dog/cat/" -e "s/hi/lo/" pets   sed -i.bak  "s/dog/cat/g" pets
  范例:取IP 地址 [root@centos8 ~]#ifconfig|sed -nr "2s/[^0-9]+([0-9.]+).*/1/p"   10.0.0.8 [root@centos8 ~]#ifconfig eth0 | sed -n "2s/^.*inet //p" | sed -n "s/  netmask.*//p" 10.0.0.8  [root@centos8 ~]#ifconfig eth0 | sed -n "2s/^.*inet //;s/ netmask.*//p" 10.0.0.8  [root@centos8 ~]#ifconfig eth0 | sed -rn "2s/(.*inet )([0-9].*)(  netmask.*)/2/p"  10.0.0.8
  范例:取基名和目录名 echo "/etc/sysconfig/network-scripts/" |sed -r "s#(^/.*/)([^/]+/?)#2#" 取基名 echo "/etc/sysconfig/network-scripts/" |sed -r "s#(^/.*/)([^/]+/?)#1#" 取目录 #取目录名 [root@centos8 ~]#echo /etc/sysconfig/ | sed -rn "s#(.*)/([^/]+)/?#1#p" /etc #取基名 [root@centos8 ~]#echo /etc/sysconfig/ | sed -rn "s#(.*)/([^/]+)/?#2#p" sysconfig
  范例:将非#开头的行加# [root@centos8 ~]#sed -rn "s/^[^#]/#&/p"   /etc/fstab #UUID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs      defaults       0 0 #UUID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4    defaults       1 2 #UUID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs      defaults       0 0 #UUID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap    defaults       0 0   [root@centos8 ~]#sed -rn "s/^[^#](.*)/#1/p" /etc/fstab #UID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs      defaults       0 0 #UID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4    defaults       1 2 #UID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs      defaults       0 0 #UID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap    defaults       0 0  [root@centos8 ~]#sed -rn "/^#/!s@^@#@p" /etc/fstab  # #UUID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs      defaults       0 0 #UUID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4    defaults       1 2 #UUID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs      defaults       0 0 #UUID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap    defaults       0 0
  范例: 将#开头的行删除#
  [root@centos8 ~] #sed -ri.bak "/^#/s/^#//" /etc/fstab
  范例:取分区利用率 [root@centos8 ~]#df | sed -nr "/^/dev/sd/s# .* ([0-9]+)%.*# 1#p" /dev/sda2 3 /dev/sda5 1 /dev/sda1 14
  范例:修改内核参数 [root@centos8 ~]#sed -nr "/^GRUB_CMDLINE_LINUX/s/"$/ net.ifnames=0"/p"  /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=8363289d-138e-4e4a-abaf- 6e028babc924 rhgb quiet net.ifnames=0" [root@centos8 ~]#sed -rn "/^GRUB_CMDLINE_LINUX=/s@(.*)"$@1 net.ifnames=0"@p"  /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=a0efb2bb-8227-4317-a79d- 0a70d515046c rhgb quiet net.ifnames=0" [root@centos8 ~]#sed -rn "/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@p"  /etc/default/grub GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=a0efb2bb-8227-4317-a79d- 0a70d515046c rhgb quiet net.ifnames=0 net.ifnames=0"
  范例:修改网卡名称 [root@centos8 ~]#sed -ri "/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@"  /etc/default/grub #centos7,8 [root@centos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg  #ubuntu [root@ubuntu ~]#grub-mkconfig -o /boot/grub/grub.cfg
  范例:查看配置文件 sed  -r  "/^(#|$)/d" /etc/httpd/conf/httpd.conf sed  -r  "/^#|^$/d" /etc/httpd/conf/httpd.conf
  范例:引用变量 [root@centos8 ~]#echo|sed "s/^/$RANDOM.rmvb/" 5242.rmvb [root@centos8 ~]#echo|sed "s/^/$RANDOM.rmvb/" $RANDOM.rmvb [root@centos8 ~]#echo|sed "s/^/"""$RANDOM""".rmvb/"
  范例:修改配置文件 [root@centos6 ~]#sed   -e "/^#/s@#@@" -e  "/^#NameVirtualHost/s@#@@" /etc/httpd/conf/httpd.conf
  3.sed 高级用法
  sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。
  常见的高级命令 P 打印模式空间开端至 内容,并追加到默认输出之前 h 把模式空间中的内容覆盖至保持空间中 H 把模式空间中的内容追加至保持空间中 g 从保持空间取出数据覆盖至模式空间 G 从保持空间取出内容追加至模式空间 x 把模式空间中的内容与保持空间中的内容进行互换 n 读取匹配到的行的下一行覆盖至模式空间 N 读取匹配到的行的下一行追加至模式空间 d 删除模式空间中的行 D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
  范例: sed -n "n;p" FILE sed "1!G;h;$!d" FILE sed ‘N;D’FILE seq 10 |sed  "3h;9G;9!d" sed "$!N;$!D" FILE sed "$!d" FILE sed ‘G’ FILE sed ‘g’ FILE sed ‘/^$/d;G’ FILE sed "n;d" FILE  sed -n "1!G;h;$p" FILE
  练习: 删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符 在centos6系统/root/install.log每一行行首增加#号 在/etc/fstab文件中不以#开头的行的行首增加#号 处理/etc/fstab路径,使用sed命令取出其目录名和基名 利用sed 取出ifconfifig命令中本机的IPv4地址 统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数 统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现) 将文本文件的n和n+1行合并为一行,n为奇数行
  文本处理三剑客之 awk
  1.awk 工作原理和基本用法说明
  awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
  有多种版本: AWK:原先来源于 AT & T 实验室的的AWK NAWK:New awk,AT & T 实验室的AWK的升级版 GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容
  gawk:模式扫描和处理语言,可以实现下面功能 文本处理 输出格式化的文本报表 执行算数运算 执行字符串操作
  格式: awk [options]   "program" var=value   file… awk [options]   -f programfile   var=value file…
  说明:
  program通常是被放在单引号中,并可以由三种部分组成 BEGIN语句块
  模式匹配的通用语句块
  END语句块
  常见选项: -F "分隔符" 指明输入时用到的字段分隔符 -v var=value 变量赋值
  Program格式: pattern{action statements;..}
  pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END
  action statements:对数据进行处理,放在{}内指明,常见:print, printf
  awk 工作过程
  第一步:执行BEGIN{action;… }语句块中的语句
  第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  第三步:当读至输入流末尾时,执行END{action;…}语句块
  BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
  分割符、域和记录 由分隔符分隔的字段(列column,域fifield)标记$1,$2...$n称为域标识,$0为所有域,注意:和shell中变量$符含义不同 文件的每一行称为记录record 如果省略action,则默认执行 print $0 的操作
  常用的action分类 output statements:print,printf Expressions:算术,比较表达式等 Compound statements:组合语句 Control statements:if, while等 input statements
  awk控制语句 { statements;… } 组合语句 if(condition) {statements;…} if(condition) {statements;…} else {statements;…} while(conditon) {statments;…} do {statements;…} while(condition) for(expr1;expr2;expr3) {statements;…} break continue exit
  2.动作 print
  格式: print item1, item2, ...
  说明: 逗号分隔符 输出item可以字符串,也可是数值;当前记录的字段、变量或awk的表达式 如省略item,相当于print $0
  范例: [root@centos8 ~]#awk "{print "hello,awk"}" [root@centos8 ~]#awk -F: "{print "wang"}" /etc/passwd [root@centos8 ~]#awk -F: "{print}" /etc/passwd [root@centos8 ~]#awk -F: "{print $0}" /etc/passwd [root@centos8 ~]#awk -F: "{print $1,$3}" /etc/passwd [root@centos8 ~]#awk -F: "{print $1"	"$3}" /etc/passwd [root@centos8 ~]#grep "^UUID" /etc/fstab |awk {"print $2,$3"} / xfs /boot ext4 /data xfs swap swap [root@centos8 ~]#awk "{print $1}" access_log |sort |uniq -c|sort -nr|head     4870 172.20.116.228    3429 172.20.116.208    2834 172.20.0.222    2613 172.20.112.14    2267 172.20.0.227    2262 172.20.116.179    2259 172.20.65.65    1565 172.20.0.76    1482 172.20.0.200    1110 172.20.28.145 [root@centos8 ~]#df | awk -F"[[:space:]]+|%" "{print $5}" Use 0 0 1 0 5 1 92 1 [root@centos8 ~]#df | grep "^/dev/sd" | awk -F"[[:space:]]+|%" "{print $5}" 5 1 92 [root@centos8 ~]#df | awk -F"[[:space:]]+|%" "/^/dev/sd/{print $5}" 5 1 92
  3. awk变量
  awk中的变量分为:内置和自定义变量
  常见的内置变量
  FS:输入字段分隔符,默认为空白字符,功能相当于 -F
  范例: awk -v FS=":" "{print $1,FS,$3}" /etc/passwd awk -v FS=":" "{print $1FS$3}" /etc/passwd awk –F:   "{print $1,$3,$7}"   /etc/passwd  S=:;awk -v FS=$S "{print $1FS$3}" /etc/passwd
  OFS:输出字段分隔符,默认为空白字符
  范例: awk -v FS=":" -v OFS=":" "{print $1,$3,$7}"   /etc/passwdRS:输入记录分隔符,指定输入时的换行符
  RS:输入记录分隔符,指定输入时的换行符
  范例: awk -v RS=" " ‘{print }’ /etc/passwd
  ORS:输出记录分隔符,输出时用指定符号代替换行符
  范例: awk -v RS=" " -v ORS="###" "{print $0}" /etc/passwd
  NF:字段数量
  范例: #引用变量时,变量前不需加$ [root@centos8 ~]#awk -F:"{print NF}" /etc/fstab  [root@centos8 ~]#awk -F:"{print $(NF-1)}" /etc/passwd [root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." "{print $(NF- 1)}"|sort |uniq -c    389 i686    208 noarch    1060 x86_64 [root@centos8 ~]#ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" "{print $(NF- 2)}" 10.0.0.1 10.0.0.7 10.0.0.1 [root@centos8 ~]#ss -nt |awk -F"[[:space:]]+|:" "/^ESTAB/{print $(NF-2)}"
  范例: 将连接数超过3个以上的IP放入黑名单拒绝访问 cat deny_dos.sh while true;do ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" "{print $(NF-2)}"|sort |uniq - c|while read count ip;do #ss -nt | awk -F"[[:space:]]+|:" "/^ESTAB/{print $(NF-2)}"|sort |uniq -c  if [ $count -gt 3 ];then    iptables -A INPUT -s $ip -j REJECT  fi done sleep 10 done
  NR:记录编号
  范例: [root@centos8 ~]#awk -F: "{print NR}" /etc/passwd 1 2 3 ....... [root@centos8 ~]#awk -F: "END{print NR}" /etc/passwd 57 [root@centos8 ~]#awk -F: "BEGIN{print NR}" /etc/passwd 0
  FNR:各文件分别计数,记录号
  范例: awk "{print FNR}" /etc/fstab /etc/inittab [root@centos8 ~]#awk "{print NR,$0}" /etc/issue /etc/redhat-release  1 S 2 Kernel r on an m 3 4 CentOS Linux release 8.0.1905 (Core)  [root@centos8 script40]#awk "{print FNR,$0}" /etc/issue /etc/redhat-release  1 S 2 Kernel r on an m 3 1 CentOS Linux release 8.0.1905 (Core)
  FILENAME:当前文件名
  范例: [root@centos8 ~]#awk "{print FILENAME}" /etc/fstab   [root@centos8 ~]#awk "{print FNR,FILENAME,$0}" /etc/issue /etc/redhat-release  1 /etc/issue S 2 /etc/issue Kernel r on an m 3 /etc/issue  1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)
  ARGC:命令行参数的个数
  范例: [root@centos8 ~]#awk "{print ARGC}" /etc/issue /etc/redhat-release  3 3 3 3 [root@centos8 ~]#awk "BEGIN{print ARGC}" /etc/issue /etc/redhat-release  3
  ARGV:数组,保存的是命令行所给定的各参数
  范例: [root@centos8 ~]#awk "BEGIN{print ARGV[0]}" /etc/issue /etc/redhat-release  awk [root@centos8 ~]#awk "BEGIN{print ARGV[1]}" /etc/issue /etc/redhat-release  /etc/issue [root@centos8 ~]#awk "BEGIN{print ARGV[2]}" /etc/issue /etc/redhat-release  /etc/redhat-release [root@centos8 ~]#awk "BEGIN{print ARGV[3]}" /etc/issue /etc/redhat-release  [root@centos8 ~]#
  自定义变量(区分字符大小写) -v var=value 在program中直接定义
  范例: awk  -v test="hello gawk" "{print test}" /etc/fstab  awk  -v test="hello gawk" "BEGIN{print test}" awk  "BEGIN{test="hello,gawk";print test}" awk  -F: "{sex="male";print $1,sex,age;age=18}" /etc/passwd  cat awkscript {print script,$1,$2} awk  -F: -f awkscript script="awk" /etc/passwd
  动作 printf
  printf 可以实现格式化输出
  格式: printf "FORMAT", item1, item2, ...
  说明: 必须指定FORMAT 不会自动换行,需要显式给出换行控制符,  FORMAT中需要分别为后面每个item指定格式符
  格式符:与item一一对应 %c:显示字符的ASCII码 %d, %i:显示十进制整数 %e, %E:显示科学计数法数值 %f:显示为浮点数 %g, %G:以科学计数法或浮点形式显示数值 %s:显示字符串 %u:无符号整数 %%:显示%自身
  修饰符 #[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f - 左对齐(默认右对齐) 如:%-15s +   显示数值的正负符号   如:%+d
  范例: awk -F:   "{printf "%s",$1}" /etc/passwd awk -F:   "{printf "%s ",$1}" /etc/passwd awk -F:   "{printf "%-20s %10d ",$1,$3}" /etc/passwd awk -F:   "{printf "Username: %s ",$1}" /etc/passwd awk -F:   "{printf "Username: %sUID:%d ",$1,$3}" /etc/passwd awk -F:   "{printf "Username: %25sUID:%d ",$1,$3}" /etc/passwd awk -F:   "{printf "Username: %-25sUID:%d ",$1,$3}" /etc/passwd
  4 .操作符
  算术操作符: x+y, x-y, x*y, x/y, x^y, x%y -x:转换为负数 +x:将字符串转换为数值
  字符串操作符:没有符号的操作符,字符串连接
  赋值操作符: =, +=, -=, *=, /=, %=, ^=,++, --
  范例: [root@centos8 ~]#awk "BEGIN{i=0;print ++i,i}" 1 1 [root@centos8 ~]#awk "BEGIN{i=0;print i++,i}" 0 1
  比较操作符: ==, !=, >, >=, <, <=
  模式匹配符: ~ 左边是否和右边匹配,包含关系 !~ 是否不匹配
  范例: [root@centos8 ~]#awk -F: "$0 ~ /root/{print $1}" /etc/passwd [root@centos8 ~]#awk -F: "$0 ~ "^root"{print $1}" /etc/passwd [root@centos8 ~]#awk "$0 !~ /root/"   /etc/passwd [root@centos8 ~]#awk "/root/"   /etc/passwd [root@centos8 ~]#awk -F: "$3==0"     /etc/passwd [root@centos8 ~]#df | awk -F"[[:space:]]+|%" "$0 ~ /^/dev/sd/{print $5}" 5 1 92 [root@centos8 ~]#ifconfig eth0 | awk "NR==2{print $2}" 10.0.0.8
  逻辑操作符: 与&&,或||,非!
  范例: awk -F:   "$3>=0 && $3<=1000 {print $1}" /etc/passwd awk -F:   "$3==0 || $3>=1000 {print $1}" /etc/passwd  awk -F:   "!($3==0) {print $1}"     /etc/passwd awk -F:   "!($3>=500) {print $3}" /etc/passwd
  条件表达式(三目表达式) selector?if-true-expression:if-false-expression
  范例: awk -F: "{$3>=1000?usertype="Common User":usertype="SysUser";printf  "%-20s:%12s ",$1,usertype}"   /etc/passwd
  5.模式PATTERN
  PATTERN:根据pattern条件,过滤匹配的行,再做处理
  1. 如果未指定:空模式,匹配每一行
  范例: [root@centos8 ~]#awk -F: "{print $1,$3}" /etc/passwd
  2. /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
  范例: [root@centos8 ~]#awk   "/^UUID/{print $1}"     /etc/fstab [root@centos8 ~]#awk   "!/^UUID/{print $1}"   /etc/fstab [root@centos8 ~]#df | awk "/^/dev/sd/" /dev/sda2      104806400 4935924  99870476   5% / /dev/sda3       52403200  398876  52004324   1% /data /dev/sda1         999320  848572     81936  92% /boot
  3. relational expression: 关系表达式,结果为"真"才会被处理
  真:结果为非0值,非空字符串
  假:结果为空字符串或0值
  范例: awk -F: "i=1;j=1{print i,j}" /etc/passwd awk "!0" /etc/passwd ;awk "!1" /etc/passwd Awk -F: "$3>=1000{print $1,$3}" /etc/passwd awk -F: "$3<1000{print $1,$3}" /etc/passwd awk -F: "$NF=="/bin/bash"{print $1,$NF}" /etc/passwd awk -F: "$NF ~ /bash$/{print $1,$NF}" /etc/passwd
  4. line ranges:行范围
  /pat1/,/pat2/ 不支持直接给出数字格式
  范例: [root@centos8 ~]#awk "/^bin/,/^adm/" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin [root@centos8 ~]#sed -n "/^bin/,/^adm/p" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin [root@centos8 ~]#awk "NR>=3 && NR<=6{print NR,$0}" /etc/passwd 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync [root@centos8 ~]#sed -n "3,6p" /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
  5. BEGIN/END模式
  BEGIN{}:仅在开始处理文件中的文本之前执行一次
  END{}:仅在文本处理完成之后执行一次
  范例 awk -F : "BEGIN {print "USER USERID"} {print $1":"$3} END{print "END FILE"}"  /etc/passwd awk -F: "{print "USER USERID";print $1":"$3} END{print "END FILE"}" /etc/passwd awk -F: "BEGIN{print "USER UID  --------------- "}{print $1,$3}" /etc/passwd awk -F: "BEGIN{print "USER UID  ------"}{print $1,$3}"END{print "========"}  /etc/passwd seq 10 | awk   "i=0" seq 10 | awk   "i=1" seq 10 | awk   "i=!i" seq 10 | awk   "{i=!i;print i}" seq 10 | awk   "!(i=!i)"               seq 10 | awk -v i=1 "i=!i"
  6.条件判断 if-else
  语法: if(condition){statement;…}[else statement] if(condition1){statement1}else if(condition2){statement2}else{statement3}
  使用场景:对awk取得的整行或某个字段做条件判断
  范例: awk -F: "{if($3>=1000)print $1,$3}" /etc/passwd awk -F: "{if($NF=="/bin/bash") print $1}" /etc/passwd awk "{if(NF>5) print $0}" /etc/fstab awk -F: "{if($3>=1000) {printf "Common user: %s ",$1} else {printf "root or  Sysuser: %s ",$1}}" /etc/passwd awk -F: "{if($3>=1000) printf "Common user: %s ",$1; else printf "root or  Sysuser: %s ",$1}" /etc/passwd df -h|awk -F% "/^/dev/sd/{print $1}"| awk "$NF>=80{print $1,$5}" df | awk -F"[[:space:]]+|%" "/^/dev/sd/{if($5>80)print $1,$5}" awk "BEGIN{ test=100;if(test>90){print "very good"}  else if(test>60){ print "good"}else{print "no pass"}}"
  7.switch语句
  语法: switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or  /REGEXP2/: statement2; ...; default: statementn}
  8.循环while
  语法: while (condition) {statement;…}
  条件"真",进入循环;条件"假",退出循环
  使用场景:
  对一行内的多个字段逐一类似处理时使用
  对数组中的各元素逐一处理时使用
  示例: [root@centos8 ~]#awk "BEGIN{print length("hello")}" 5 [root@centos8 ~]#awk "BEGIN{print length("马哥教育")}" 4 [root@centos7 ~]#awk "/^[[:space:]]*linux16/{i=1;while(i<=NF){print  $i,length($i); i++}}" /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-1062.el7.x86_64 31 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13 linux16 7 /vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13 [root@centos7 ~]#awk "/^[[:space:]]*linux16/{i=1;while(i<=NF)  {if(length($i)>=10){print $i,length($i)}; i++}}" /etc/grub2.cfg /vmlinuz-3.10.0-1062.el7.x86_64 31 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 crashkernel=auto 16 net.ifnames=0 13 /vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 crashkernel=auto 16 net.ifnames=0 13 [root@centos8 ~]#awk "BEGIN{ total=0;i=1;while(i<=100){total+=i;i++};print  total}" 5050
  9.循环 do-while
  语法: do {statement;…}while(condition)
  意义:无论真假,至少执行一次循环体
  do-while循环
  语法:do {statement;…}while(condition)
  意义:无论真假,至少执行一次循环体
  范例: [root@centos8 ~]#awk "BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print total}" 5050
  10. 循环for
  语法: for(expr1;expr2;expr3) {statement;…}
  常见用法: for(variable assignment;condition;iteration process) {for-body}
  特殊用法:能够遍历数组中的元素 for(var in array) {for-body}
  范例: [root@centos8 ~]#awk "BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}" 5050
  范例: [root@centos7 ~]#awk "/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print  $i,length($i)}}" /etc/grub2.cfg linux16 7 /vmlinuz-3.10.0-1062.el7.x86_64 31 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13 linux16 7 /vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50 root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46 ro 2 crashkernel=auto 16 rhgb 4 quiet 5 net.ifnames=0 13
  性能比较 time (awk "BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}") time (total=0;for i in {1..10000};do total=$(($total+i));done;echo $total) time (for ((i=0;i<=10000;i++));do let total+=i;done;echo $total) time (seq –s "+" 10000|bc)
  11. continue和break
  格式: continue [n] break [n]
  范例: [root@centos8 ~]#awk "BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0)continue;sum+=i}print sum}" 2500 [root@centos8 ~]#awk "BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==50)break;sum+=i}print sum}" 1225
  12 .next
  next 可以提前结束对本行处理而直接进入下一行处理(awk自身循环)
  范例: [root@centos8 ~]#awk -F: "{if($3%2!=0) next; print $1,$3}" /etc/passwd root 0 daemon 2 lp 4 shutdown 6 mail 8 games 12 ftp 14 nobody 65534 polkitd 998 gluster 996 rtkit 172 rpc 32 chrony 994 saslauth 992 clevis 984 pegasus 66 colord 982 setroubleshoot 980 gdm 42 gnome-initial-setup 978 sshd 74 avahi 70 tcpdump 72 wang 1000
  13.数组
  awk的数组为关联数组
  格式 array[index-expression]
  范例: weekdays["mon"]="Monday"
  index-expression 可使用任意字符串;字符串要使用双引号括起来 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为"空串" 若要判断数组中是否存在某元素,要使用"index in array"格式进行遍历
  范例: [root@centos8 ~]#awk  "BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print  weekdays["mon"]}" Monday
  范例: awk "!line[$0]++" dupfile awk "{!line[$0]++;print $0, line[$0]}" dupfile
  范例:判断数组索引是否存在 [root@centos8 ~]# awk "BEGIN{array["i"]="x"; array["j"]="y" ; print "i" in array, "y" in array }" 1 0 [root@centos8 ~]#awk "BEGIN{array["i"]="x"; array["j"]="y" ;if ("i" in array ) {print "存在"}else{print "不存在"}}" 存在 [root@centos8 ~]#awk "BEGIN{array["i"]="x"; array["j"]="y" ;if ("abc" in array ) {print "存在"}else{print "不存在"}}" 不存在
  若要遍历数组中的每个元素,要使用for循环 for(var in array) {for-body}
  注意:var会遍历array的每个索引
  范例:遍历数组 [root@centos8 ~]#awk  "BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays)  {print weekdays[i]}}" Tuesday Monday [root@centos8 ~]#awk "BEGIN { a["x"] = "welcome" a["y"] = "to" a["z"] = "Magedu" for (i in a) {      print i,a[i] }}" x welcome y to z Magedu [root@centos8 ~]#awk -F: "{user[$1]=$3}END{for(i in user){print "username:  "i,"uid: "user[i]}}" /etc/passwd username: adm uid: 3 username: rpc uid: 32 username: dnsmasq uid: 985 username: radvd uid: 75 username: sync uid: 5 username: mail uid: 8 username: exim uid: 93 username: tss uid: 59 username: gluster uid: 996 username: unbound uid: 995 username: halt uid: 7
  范例: [root@centos8 ~]#cat ss.log | sed -nr "1!s/^([^0-9]+) .*/1/p"|sort |uniq -c     529 ESTAB           9 LISTEN        128 SYN-RECV       95 TIME-WAIT [root@centos8 ~]#ss -ant | awk "NR!=1{state[$1]++}END{for(i in state){print  i,state[i]}}" SYN-RECV 128 LISTEN 9 ESTAB 529 TIME-WAIT 95 [root@centos8 ~]#netstat -tan | awk "/^tcp/{state[$NF]++}END{for(i in state) {print i,state[i]}}" LISTEN 9 SYN_RECV 126 ESTABLISHED 523 FIN_WAIT2 40 [root@centos8 ~]#awk "{ip[$1]++}END{for(i in ip){print i,ip[i]}}"  /var/log/httpd/access_log 172.20.0.200 1482 172.20.21.121 2 172.20.30.91 29 172.16.102.29 864 172.20.0.76 1565 172.20.9.9 15 172.20.1.125 463 172.20.61.11 2 172.20.73.73 198 [root@centos8 ~]#awk "{ip[$1]++}END{for(i in ip){print ip[i],i}}" access_log  |sort -nr| head -3 4870 172.20.116.228 3429 172.20.116.208 2834 172.20.0.222 [root@centos8 ~]#awk "{ip[$1]++}END{for(i in ip){print i,ip[i]}}" access_log  |sort -k2 -nr|head -3 172.20.116.228 4870 172.20.116.208 3429 172.20.0.222 2834
  范例:多维数组 [root@centos8 ~]#awk "BEGIN{ > array[1][1]=11 > array[1][2]=12 > array[1][3]=13 > array[2][1]=21 > array[2][2]=22 > array[2][3]=23 > for (i in array) >     for (j in array[i]) >         print array[i][j] > }" 11 12 13 21 22 23
  14 awk函数
  awk 的函数分为内置和自定义函数
  常见内置函数
  数值处理:
  rand():返回0和1之间一个随机数
  srand():配合rand() 函数,生成随机数的种子
  int():返回整数
  范例: [root@centos8 ~]#awk "BEGIN{srand();print rand()}" 0.790437 [root@centos8 ~]#awk "BEGIN{srand();print rand()}" 0.283736 [root@centos8 ~]#awk "BEGIN{srand();print rand()}" 0.948082 [root@centos8 ~]#awk "BEGIN{srand();print rand()}" 0.371798 [root@centos8 ~]#awk "BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100)  }"  35 17 35 95 19 15 70 54 46 93
  字符串处理:
  length([s]):返回指定字符串的长度
  sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
  范例: [root@centos8 ~]#echo "2008:08:08 08:08:08" | awk "sub(/:/,"-",$1)" 2008-08:08 08:08:08 [root@centos8 ~]#echo "2008:08:08 08:08:08" | awk "{sub(/:/,"-",$1);print $0}" 2008-08:08 08:08:08
  gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
  范例: [root@centos8 ~]#echo "2008:08:08 08:08:08" | awk "gsub(/:/,"-",$0)" 2008-08-08 08-08-08 [root@centos8 ~]#echo "2008:08:08 08:08:08" | awk "{gsub(/:/,"-",$0);print $0}" 2008-08-08 08-08-08
  split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…
  范例: [root@centos8 ~]#netstat -tn | awk  "/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}" 10.0.0.1 1 10.0.0.6 1 10.0.0.7 673
  system 函数:可以awk中调用shell命令
  空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了
  awk的变量外其他一律用""引用起来 awk "BEGIN{system("hostname")}" awk "BEGIN{score=100; system("echo your score is " score) }" [root@centos8 ~]#netstat -tn | awk  "/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){if(count[i]>=10) {system("iptables -A INPUT -s "i" -j REJECT")}}}"
  自定义函数
  自定义函数格式: function name ( parameter, parameter, ... ) {    statements    return expression }
  范例: [root@centos8 ~]#cat func.awk function max(x,y) {  x>y?var=x:var=y  return var } BEGIN{print max(a,b)} [root@centos8 ~]#awk -v a=30 -v b=20 -f func.awk 30
  15. awk脚本
  将awk程序写成脚本,直接调用或执行
  范例: [root@centos8 ~]#cat passwd.awk  {if($3>=1000)print $1,$3} [root@centos8 ~]#awk -F: -f passwd.awk /etc/passwd nobody 65534 wang 1000 mage 1001
  范例: [root@centos8 ~]#cat test.awk #!/bin/awk -f #this is a awk script {if($3>=1000)print $1,$3} [root@centos8 ~]#chmod +x test.awk [root@centos8 ~]#./test.awk -F: /etc/passwd nobody 65534 wang 1000 mage 1001
  向awk脚本传递参数
  格式: awkfile var=value var2=value2... Inputfile
  注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数
  范例: [root@centos8 ~]#cat test2.awk  #!/bin/awk -f {if($3 >=min && $3<=max)print $1,$3}  [root@centos8 ~]#chmod +x test2.awk [root@centos8 ~]#./test2.awk -F: min=100 max=200 /etc/passwd systemd-resolve 193 rtkit 172 pulse 171 qemu 107 usbmuxd 113 abrt 173
  【有需要pdf版资料的,可见下图领取方式】

为什么液晶电视主板维修要使用恒温焊台烙铁电器维修离不开焊接,所以电烙铁使用最广泛,早期期电器维修,集成化不严重,没有贴片元件,所以一把几元钱的电烙铁就搞定啦,但是,现在电器集成化很严重,动不动就芯片,以前的直插电烙铁,是电动车电瓶冬季跑不远原因分析电动车电瓶为什么冬季就跑不远了,一般有一下几种原因第一轮胎气压低车子沉重,耗电太快,第二电机退磁,电机磁力减退,电流过大,耗电量加大,第三线路老化,线路接触不良,或者正极线搭铁,引斗罗大陆小舞的父亲是人还是魂兽?其实,小说中已经证实了小舞的母亲是十万年魂兽,这点不用说,相比大家也都知道了。在武魂殿围剿的时候,小舞的母亲为了救小舞,自己命丧于教皇比比东。而小舞的父亲却一直没有出现过。那么,小舞的父亲究竟是人还是妖呼伦贝尔唐可试乘,直降0。3万元今天给大家推荐一款车它就是唐,特别适合日常使用,据悉比亚迪益丰祥泰店09。2509。25限时回馈用户,购车优惠1。81,对唐感兴趣的朋友不妨亲自体验一下促销时间2021年09月252018年国产手机盘点华为小米巨头当道,中小品牌生存危机IDC数据显示,2018年第三季度全球智能手机出货量3。6亿部,同比下降6,已经是连续第四个季度下滑。中国手机市场同样持续低迷,连续六个季度下滑,甚至首次出现了量价双降的局面。GF美团快驴进货供应链助力网红火锅品牌复工复产在社交媒体上,疫情结束了你最想做什么?的话题刷屏了,我要吃一顿火锅!高票上榜。你盼着烟火气再次聚拢在热气升腾的火锅里,而火锅店老板们除了盼着冷火秋烟快点散去,还要先解决另外一个更重呼伦贝尔秦ProDM热销中,降价3。65本周最新车市行情,秦ProDM,比亚迪益丰祥泰店购车优惠0。5万元09月26日09月26日,观望秦ProDM的朋友,机会难得,不要犹豫,不要错过下手好机会促销时间2021年09月2呼伦贝尔比亚迪F3让利促销,最高优惠0。3万元,欢迎垂询比亚迪益丰祥泰店比亚迪F3,现车供应,火热销售中,为回馈广大用户,09。2609。26最高优惠6。28,轻松圆您购车梦促销时间2021年09月26日至2021年09月26日优惠条件呼伦贝尔秦店内限时特惠4。62,欢迎到店鉴赏手握购车款犹豫不决的你是不是还在为买车而观望,当前比亚迪益丰祥泰店秦限时特惠0。3万元颜色可选,现车充足,优惠时间即日起到09月25日,犹豫不决的朋友不妨到店亲身试驾一下,店铺地址出租汽车更换,首选比亚迪F3近年来,国内的经济增长迅速,国内的汽车保有量蹭蹭的上涨,虽然说目前市场开始疲软,但是国人对于汽车的热情依旧是高涨,不少的老百姓对于豪车以及新车型都保持着高度的关注,当然也时刻关注着呼伦贝尔宋ProDM可试乘,限时特惠5。89手握购车款犹豫不决的你是不是还在为买车而观望,当前比亚迪益丰祥泰店宋ProDM降价1。0万元颜色可选,现车充足,优惠时间即日起到09月26日,犹豫不决的朋友不妨到店亲身试驾一下,店
一键遥控轻松开帘小益C3双平台智能电动窗帘前言随着5G的到来,网速的提高,智能设备在家庭的应用中越来越普遍,而且人工智能也在一步步的发展,后续的智能设备也会越来越先进,从第一台小爱同学,家里多了很多智能设备,比如电动衣架,电动牙刷办理质检报告GB4706质检报告的用途1招投标政府部门事业单位招投标2。进入大型超市或卖场,各大网上商城3。审核证明,申请政府补助4。工商质检与市场监督5。国内市场销售资质认定等现在消费者对商品质量越来越太阳能灯电池板为什么要做欧盟CE认证ROHS认证?太阳能灯是由太阳能电池板转换为电能的电灯。在白天,即使是在阴天,这个太阳能发电机(太阳能板)也可以收集,存储太阳能量。太阳能灯作为一种安全环保新电灯,从而越来越受到重视。凡是贴有c无线充亚马逊要求哪些认证无线充亚马逊要求哪些认证,北美站需要FCCFCC认证要多少钱需要看要做的FCC认证的类别,做不同的类别,FCC认证费用也不一样。之前FCC认证分为FCCVOC,FCCDOC,FCC显示器连接线出口欧盟要做ROHS认证吗?显示器连接线有3种HDMI连接线VGA连接线DVI连接线。2015年6月4日,欧盟在其公报上发布指令(EU)2015863对201165EU(RoHS2。0)进行修订,正式将四种邻无线麦克风申请欧盟CERED认证指令怎么做?无线话筒,是由若干部袖珍发射机(可装在衣袋里,输出功率约0。01W)和一部集中接收机组成,每部袖珍发射机各有一个互不相同的工作频率,集中接收机可以同时接收各部袖珍发射机发出的不同工深度试驾一汽大众ID。6CROZZ空间够用续航真实车机差点意思视频加载中买车之前,一定要静静!欢迎收看本期节目。今天我给大家带来了一款中大型纯电SUVID。6CROZZ。ID。6是大众品牌继ID。4之后引入中国的第二款ID。系列的纯电产品,一贴牌丰田Yaris?马自达2新车曝光,搭载混合动力系统日前,外媒曝光了一组新款马自达2的新车谍照,尽管新车的Logo被黑色胶带贴住,但从轮廓上依稀能辨认出马自达的品牌。再加上此前马自达与丰田合作的消息,新车很大程度上是一台拥有丰田Ya外观霸气空间出色2020款大众途昂直降5。8万搭载V6引擎!作为一款中大型SUV,上汽大众的途昂深受消费者关注。除了霸气的外观以及宽敞的空间外,2。5TV6引擎的搭载也成为其热销的卖点。目前,据编者了解到,北京地区2020款大众途昂直降5。论文解读002带你读智能合约开山之作,一文读懂智能合约又到了本周的论文分享环节了,这次分享的区块链领域相关论文是一篇写于1994年的smartcontracts智能合约。提起智能合约大家可能都有所了解,但又感觉不是那么了解,一旦开始和聊聊看似毫无关联的元宇宙和产业互联网1hr一切从元宇宙说起很长一段时间了,元宇宙这个概念被炒得很火,腾讯网易字节跳动Facebook等各路互联网头部企业纷纷入局,一时间赚足了大众的眼球。表面上看,元宇宙是一个游戏生态