awk用法总结
简介
awk的命名来自于他的三位创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan 的姓氏的首字母。
有多种版本:New awk(nawk),GNU awk( gawk) 一般在linux中awk就指gawk,gawk 是 AWK 的 GNU 版本
值得说的是,gawk被他的创始人定义为模式扫描和处理语言而不是文本处理工具,事实上gawk可以说就是一个文本分析工具。之所以awk被他的创始人定义为一门语言我想其寓意可能有两点,首先作为一门语言,awk会有自己比较丰富程序设计语言。其次也是awk功能强大的一种体现。
本文将会较为详细的介绍关于awk的各种用法,同时附带大量的示例实际操作,有助于大家理解。
基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{ action;… }' file ...
awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块 、END语句块,共3部分组成
program通常是被单引号或双引号中建议使用单引号
选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量
一、语法
基本格式:
awk [options] 'program' file…
program:pattern{action statements;..}
pattern和action:
• pattern部分决定动作语句何时触发及触发事件
BEGIN,END
• action statements对数据进行处理,放在{}内指明
print, printf
分割符、域和记录:
awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称 为域标识。
$0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录
省略action,则默认执行 print $0 的操作
二、awk工作原理
第一步:执行BEGIN{action;… }语句块中的语句
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这 个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个 可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如 打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
pattern语句块中的通用命令是最重要的部分,也是可选的。如果 没有提供pattern语句块,则默认执行{ print $0 },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
三、变量
awk中的变量有两种,内置变量和自定义变量
awk中的内置变量
- FS:输入字段分隔符,默认为空白字符
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd
[root@CentOS6 ~]#awk -v FS=':' '{print $1,FS,$3}' /etc/passwd #变量直接引用,awk同样可以引用bash中定义的变量
root : 0
bin : 1
daemon : 2
[root@CentOS6 ~]#s=':';awk -v FS="$s" '{print $1,$3}' /etc/passwd #引用bash中定义的变量
root 0
bin 1
- OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd - RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
awk -v RS=' ' ‘{print }’ /etc/passwd - ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd - NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$
[root@CentOS6 ~]#awk -F: '{print NF}' /etc/passwd
7 #统计行字段数,指定分隔符为:
awk -F: '{print $(NF-1)}' /etc/passwd
[root@CentOS6 ~]#awk -F: '{print $(NF-1)}' /etc/passwd
/root #打印倒数第二个字段,分隔符为:
/bin
/sbin
- NR:行号
awk '{print NR}' /etc/fstab ;
awk END'{print NR}' /etc/fstab
[root@CentOS6 ~]#awk 'END{print NR}' /etc/fstab
16 #统计行号
- FNR:各文件分别计数,行号
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab - ARGC:命令行参数的个数
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
[root@CentOS6 ~]#awk 'END{print ARGC}' /etc/fstab /etc/passwd
3 #一般认为命令之后的项目都是参数,但awk认为awk自身也是一个参数
- ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
awk自定义变量
awk中的自定义变量区分大小写
两种定义方式:
(1) -v var=value
(2) 在program中直接定义
示例:
在program之外定义变量并引用
[root@CentOS6 ~]#awk -v test='hello,gawk' 'BEGIN{print test}' /etc/fstab
hello,gawk
直接在program中定义以及引用变量
[root@CentOS6 ~]#awk -F: '{sex="male";print $1,sex,age;age=18}' /etc/passwd
root male #打印第一行时变量age还没有值所以第一行age不打印
bin male 18
四、操作符
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
[root@CentOS6 ~]#awk 'BEGIN{print i++,i}'
0 1 #赋值打印先后问题
[root@CentOS6 ~]#awk 'BEGIN{print ++i,i}'
1 1
[root@CentOS6 ~]#awk '{n=100;print sum+=n }' /etc/fstab
100 #sum+=n就等于sum=sum+n
200
300
++, --
比较操作符:
==, !=, >, >=, <, <=
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配
[root@CentOS6 ~]#awk -F: '$0~/^root/{print $0}' /etc/passwd
#打印行首为root的行
root:x:0:0:root:/root:/bin/bash
逻辑操作符:与&&,或||,非!
awk中的逻辑操作符与或非值表示逻辑关系,不像bash中有短路效果
[root@CentOS6 ~]#awk -F: '!($3>=500){print $3}' etc/passwd
0 #打印小于500的UID
81
499
函数调用
function_name(argu1, argu2, ...)
条件表达式(三目表达式)
selector?if-true-expression:if-false-expression
[root@CentOS6 ~]#awk -F: '{$3>=500?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15-s:%-s\n",$1,usertype}' /etc/passwd
# 如果$3UID大于500定义变量,usertype用户类型是普通用户,否则定义变量usertype为系统管理员或者系统用户
#printf指定打印格式,$1用户名左对齐指定宽度15个字符,引用变量usertype左对齐,加换行符
root :Sysadmin or SysUser
bin :Sysadmin or SysUser
huxiaoqi :Common User
gentoo :Common User
五、awk PATTERN
PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk '/^UUID/{print $1}' /etc/fstab #打印行首为UUID行的第一条属性
awk '!/^UUID/{print $1}' /etc/fstab #打印行首不是UUID的第一条属性
(3) relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
[root@CentOS6 ~]#awk -F: 'i=!i{print NR,$0,i}' /etc/passwd
#打印奇数行加行号和当时的i的值
#首次循环中,i的初始值为空,那么!i不为空,所以打印后续动作
#第二轮循环,i值初始值不为空,!i为空,跳过后续动作
1 root:x:0:0:root:/root:/bin/bash 1
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 1
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 1
(4)line ranges:行范围
startline,endline:/pat1/,/pat2/ 不支持直接给出数字
格式
awk -F: ‘/root>/,/nobody>/{print $1}' /etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}' /etc/passwd
[root@CentOS6 ~]#awk -F: '(NR>=10&&NR<=13){print NR,$1}' /etc/passwd
10 uucp #打印行号大于等于10并且小于等于13的用户名加行号
11 operator
12 games
13 gopher
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
示例:
[root@CentOS6 ~]#awk -F: 'BEGIN{print "USER UID \n---------------"}{print $1,$3}END{print "===================="}' /etc/passwd
USER UID
---------------
root 0
...
baobaotian 508
====================
六、awk action
action statements对数据进行处理,放在{}内指明
awk [options] 'program:pattern{action statements;..} ' file…
常用的action分类
(1) Expressions:算术,比较表达式等
(2) Control statements:if, while等
(3) Compound statements:组合语句
(4) input statements:输入项目
(5) output statements:print等
print格式
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、 变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}'
[root@CentOS6 ~]#awk '{print "hello,world"}'
haha #每次从标准输入读入行都会打印“hello,world”
hello,world
awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd
[root@CentOS6 ~]#awk -F : '{print $1"\t"$3}' /etc/passwd
root 0 #-F: 指定:为分隔符
bin 1 #打印用户名和UID
daemon 2
tail –3 /etc/fstab |awk ‘{print $2,$4}’ #awk自动理解文件的分隔符
printf
格式化输出:printf “FORMAT”, item1, item2, ...
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐) %-15s
+:显示数值的正负符号 %+d
[root@CentOS6 ~]#awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwd
#指定$1是字符串,左对齐指定宽度20个字符,$3为十进制字符,默认右对齐宽度10个字符
#指定换行符\n
root 0
bin 1
daemon 2
七、awk控制语句
主要的控制语句:
{ statements;… } 组合语句
if(condition) {statements;…} 条件判断语句
if(condition) {statements;…} else {statements;…}
while(conditon) {statments;…} 循环语句
do {statements;…} while(condition)
for(expr1;expr2;expr3) {statements;…}
break
continue
delete array[index]
delete array
exit
if-else语句:
语法:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2} else{statement3}使用场景:对awk取得的整行或某个字段做条件判断
示例:
[root@CentOS6 ~]#awk -F: '{if($3>=500){printf "Common user:%s\n",$1}else{printf"root or Sysuser: %s\n",$1}}' /etc/passwd #条件判断语句后的多条statement要用大括号括起来
root or Sysuser: root #如果UID大于等于500就打印用户名加"root or Sysuser:"
root or Sysuser: bin #否则打印用户名加"Common user:"
Common user:huxiaoqi
Common user:gentoo
[root@CentOS6 ~]#df -h|awk -F% '/^\/dev\/sd/{print $1}'|awk '$NF>=10{print $1,$NF}'
/dev/sda2 11 #第一次awk过滤以取出/dev/sd开头的行,-F%指定分隔符打印$1目的是去掉%号让第二次可以对$NF直接进行数字比较
[root@CentOS6 ~]#awk 'BEGIN{test=87;if(test>90){print"Very good"}else if(test>60){print "good"}else{print "no pass"}}'
good #先变量赋值,再使用条件判断语句判断变量,如果变量值大于90打印"Very good",如果变量值大于60打印"good",否则打印"no pass"
while循环
语法:
while(condition){statement;…}
条件“真”,进入循环;条件“假”,退出循环
使用场景:
对一行内的多个字段逐一类似处理时使用
对数组中的各元素逐一处理时使用
[root@CentOS7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i)};i++}}' /etc/grub2.cfg
#/^[[:space:]]*linux16/ 匹配行首有任意数量空格跟linux16的行
#设定i初始值为1进入循环并且每次循环自增,(i<=NF)循环次数和字段数NF相等
#循环内置条件判断,判断length($i)shell内置函数字段长度大于等于10,那么就打印该字段以及字段长度
/vmlinuz-3.10.0-514.el7.x86_64 30
root=UUID=851ee323-783c-44fe-93f5-333b9fe02b34 46
crashkernel=auto 16
LANG=en_US.UTF-8 16
net.ifnames=0 13
/vmlinuz-0-rescue-a8324cea4b7748b7a2b0c26dd1a9fa55 50
root=UUID=851ee323-783c-44fe-93f5-333b9fe02b34 46
crashkernel=auto 16
[root@CentOS6 ~]#cat f1.txt
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
[root@CentOS6 ~]#awk '{i=1;sum=0;while(i<=NF){sum+=$i;i++};print sum,i}' f1.txt
55 11 #将一条记录的所有字段加总
165 12 #每条记录进入循环以后sum清零
#内置循环,循环次数等于字段个数
#如果不清零每条记录的sum值那么将统计文本内所有字段的总和
[root@CentOS6 ~]#awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
5050 #设定初始值i=1;sum=0,i小于100进入循环每次自增1循环100次,计算1到100之间的数字之和
do-while循环
语法:do {statement;…}while(condition)
意义:无论真假,至少执行一次循环体
for循环
语法:
for(expr1;expr2;expr3) {statement;…}
常见用法:
for(variable assignment;condition;iteration process)
{for-body}
特殊用法:
能够遍历数组中的元素
语法:for(var in array) {for-body}
[root@CentOS6 ~]#time awk 'BEGIN{for(i=0;i<=1000000;i++){sum+=i}print sum}'
500000500000
real 0m0.120s
user 0m0.119s
sys 0m0.001s
bash awk性能比较
分别用shell,awk,bc计算1到1000000之间所有数字之和比较消耗时间
awk表现:
[root@CentOS6 ~]#time awk 'BEGIN{i=1;sum=0;while(i<=1000000){sum=sum+i;i++}print sum}'
500000500000
real 0m0.216s
user 0m0.212s
sys 0m0.004s
shell表现:
[root@CentOS6 ~]#time (sum=0;for (( i=0; i<=1000000 ;i++ ));do let sum+=i;done;echo $sum)
500000500000
real 0m16.710s
user 0m15.939s
sys 0m0.767s
bc表现:
[root@CentOS6 ~]#time(seq -s "+" 1000000|bc)
500000500000 #seq -s "+" 指定seq分隔符为"+"
real 0m1.383s
user 0m1.320s
sys 0m0.085s
awk性能最佳
swich语句
swich语句作用类似bash中的case语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; ...; default: statementn}
break和continue
[root@CentOS6 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++) {if(i%2==0)continue;sum+=i}print sum}'
2500
#利用continue语句计算1到100之间所有奇数之和
#循环内置条件判断if(i%2==0)continue对i取模如果i为偶数实行continue跳过本次循环
与bash类似awk语句中break和continue同样支持指定跳过第几层循环
break [n]
continue [n]
next: 提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
[root@CentOS6 ~]#awk -F: '{if(NR%2!=0)next;print NR,$0}' /etc/passwd
#awk本身每条记录自带循环
#对行号取模如果结果非0也就是奇数行执行next,跳过该条记录,结果只打印偶数行
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
八、awk数组
关联数组:array[index-expression]
index-expression: 数组索引、下标
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建 此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
若要遍历数组中的每个元素,要使用for循环
for(var in array) {for-body}
注意:var会遍历array的每个索引
[root@CentOS6 ~]#awk -F: '{line[$7]++}END{for (i in line)print i,line[i]}' /etc/passwd
#利用数组总结各个shell类型出现个次数
#-F:指定文本的字段分隔符为":",$7就是shell类型
#$7shell类型作为关联数组line的下标索引,{line[$7]++}awk每条记录的每次循环都会给line[$7]重新付一次值,每次加一
#{for (i in line)print i,line[i]} for循环,把列表line也就是数组的下标赋值给变量i
/sbin/shutdown 1
/bin/csh 1
/bin/bash 10
/sbin/nologin 29
/sbin/halt 1
/bin/sync 1
[root@CentOS6 ~]#awk '{line[$1]++}END{for (i in line)print i,line[i]}' access_log |sort -nr -k2
#利用awk中的数组取出访问日志中各个ip地址访问的次数,排序之后将异常的ip取出
#sort -nr 从大到小排序,-k2 指定排序的参考项默认分隔符为空格
172.18.125.70 155364
172.18.22.188 9367
...
利用数组去重:
[root@CentOS6 ~]#awk -F: '!line[$7]++' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
gentoo:x:501:501:Gentoo Distribution:/home/gentoo:/bin/csh
#-F:指定字段分隔符为":",$7为shell类型
#awk每条记录的循环会给line[$7]赋一次值,不同shell类型为索引的数组首次循环都为空串数组,!line[$7]++所以首次结果为真默认执行打印$0
#首次以后关联数组被赋值!line[$7]++的结果都为假,不执行打印动作
统计连接状态:
[root@CentOS6 ~]#netstat -nat |awk '/^tcp/{stat[$NF]++}END{for(i in stat)print i,stat[i]}'
ESTABLISHED 2
LISTEN 10
统计ip访问连接量
[root@CentOS6 ~]#netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 64 172.18.45.6:22 172.18.45.107:2585 ESTABLISHED
tcp 0 0 172.18.45.6:22 172.18.45.107:4262 ESTABLISHED
#命令原始状态
[root@CentOS6 ~]#netstat -nt | awk -F'[[:space:]:]+' '/^tcp/{ip[$6]++}END{for (i in ip)print i,ip[i]}'
172.18.45.107 2
#-F'[[:sapce:]:]+' 指定空格和":"都作为字段分隔符$6就是ip地址
求男女平均分:
数组写法
[root@CentOS6 bin]#cat score.txt
mage 100 male
wang 90 male
zhang 80 female
li 100 female
[root@CentOS6 bin]#awk '{total[$3]+=$2;num[$3]++}END{for(name in total){print name,total[name],total[name]/num[name]}}' score.txt
female 180 90
male 190 95
#total[$3]+=$2 分别加总男女总分
#num[$3]++ 分别加总男女个数
#for(name in total)将total数组下标赋值给变量name
#print name为打印性别
#print total[name]为打印男女各自总分
#print total[name]/num[name]为打印平均分
变量写法:
[root@CentOS6 bin]#awk '{if($3 == "male"){msum+=$2;mnum++}else{fsum+=$2;fnum++}}END{printf "msum=%d mavg=%.2f\nfsum=%d favg=%.2f\n",msum,msum/mnum,fsum,fsum/fnum}' score.txt
msum=190 mavg=95.00
fsum=180 favg=90.00
九、awk函数
内置函数
数值处理:
rand():返回0和1之间一个随机数
[root@CentOS6 ~]#awk 'BEGIN{srand(); print rand() }'
0.70397
[root@CentOS6 ~]#awk 'BEGIN{srand(); print int(rand()*100) }'
62
#int(rand()*100) 原始命令生成的是小数乘以100就是生成100以内的随机数,int命令取整
字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹 配的内容替换为s
echo "2008:08:08 08:08:08" | awk 'sub(/
awk用法总结的更多相关文章
- awk 用法(使用入门)
转自:http://www.cnblogs.com/emanlee/p/3327576.html awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命 ...
- awk用法小结(作者总结)
http://www.chinaunix.net/old_jh/24/691456.html http://wenku.baidu.com/view/ebac4fc658f5f61fb736664d. ...
- sed和awk用法
sed和awk用法 Sed sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为 ...
- linux awk用法
awk是一个强大的文本分析工具,在对数据进行分析并生成报告时显得尤为强大. 使用方法:awk [options] 'BEGIN{ commands } pattern{ commands } END ...
- 转shell中的awk用法详解
awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 调用awk: 第一种,命令行方式 ...
- 收集整理的awk用法小结
awk 用法:awk ‘ pattern {action} ‘ 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输 ...
- AWK 用法
awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS ...
- 精通awk系列(4):awk用法入门
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk用法入门 awk 'awk_program' a.txt awk示例: # 输出a.txt中的每一行 awk '{print $0 ...
- awk用法
目前虽然有很多工具可以代替awk,但是呢我还是认为awk还是非常重要,比如有时候load数据到hive,mysql发现数据有点问题,这样可以先对比文件和库中数据是否一致,这样awk就发挥用处了,还有从 ...
- AWK用法入门详解
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
随机推荐
- Linux多线程编程的条件变量
在stackoverflow上看到一关于多线程条件变量的问题,题主问道:什么时候会用到条件变量,mutex还不够吗?有个叫slowjelj的人做了很好的回答,我再看这个哥们其他话题的一些回答,感觉水平 ...
- cURL实现Get和Post
1.Get请求: //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.jb51.n ...
- LeetCode算法题目解答汇总(转自四火的唠叨)
LeetCode算法题目解答汇总 本文转自<四火的唠叨> 只要不是特别忙或者特别不方便,最近一直保持着每天做几道算法题的规律,到后来随着难度的增加,每天做的题目越来越少.我的初衷就是练习, ...
- Create a /etc/yum.repos.d/mongodb-org-4.0.repo
Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux — MongoDB Manual https://doc ...
- mysql-test-run.pl
wget https://raw.githubusercontent.com/mysql/mysql-server/5.7/mysql-test/mysql-test-run.pl
- Cocos2d-x如何添加新场景及切换新场景(包括场景特效)
做了一天多的工作终于把此功能搞定了,实际上添加新场景花费不了多少时间,时间主要花在切换到另一个场景的实现上,主要原因是编译时出现了一个错误,百思不得其解,后来经过查资料不断摸索才知道自己问题的所在,改 ...
- Non-parseable POM C:\Users\admin\.m2\repository\org\springframework问题解决方案
现象: [INFO] Scanning for projects... [ERROR] [ERROR] Some problems were encountered while processing ...
- ThinkPHP验证码不现实的处理方法
ThinkPHP测试的时候遇到验证码不显示的问题,主要解决思路如下: 1.php.ini是否开启gd库: 2.页面编码是否一致: 3.检查页面头部信息BOM,这是最主要的,把下面代码复制到根目录下,然 ...
- FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案
在实际的项目中,从音频设备采集到的音频的类型和编码器类型(aac ,amr)通常是不一致的. 那么我们首先需要做重采样的过程.利用swr_convert 重新采样. 这时候我们可能会遇到另外一个问题. ...
- poj3181【Dollar Dayz】
做完这道题,心里五味陈杂,明明是最水的一道题,我却做了最长的时间. 题意是求用1-k的和表示n的方案数. 显然是个计数dp,但我不会.思考半小时未果. 然后找尹鹏哲,他给我讲了个错的dp方程,结果调试 ...