建表123456CREATE TABLE `tmp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `point` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
查询 SQL根据 name 字段进行分组,并取每个分组中 point 最大的 n 条记录:
1SELECT a.* FROM tmp a WHERE n > ( SELECT count( * ) FROM tmp b WHERE b.name = a.name AND b.point > a.point )
测试假如现在有数据:
id
name
point
1
张三
60
2
张三
80
3
张三
90
4
张三
95
5
李四
74
6
李四
95
7
李四
82
8
李四
100
想要的结果是: 获得张三和李四 point 较大的前两条记录
...
正文dao 层增加一个方法,比如
1void clear();
mapper.xml 中增加对应的即可
123<update id="clear"> truncate table sys_logs;</update>
重点其实只要知道对应的是 update 就可以了,其他用法跟 增删改查 一致。
需求生产机器没网络呗,装好了 pip 了,开始装一些必要的,然后还是没网,咋整勒,这就是续篇了。
本章以 requests 为例。
正文首先,老规矩,去有网的机器上扒一下安装包
1pip download -d /home/workspace/packages requests
这样,安装包就在 /home/workspace/packages 中了,有一些是 .tar,有一些 .whl,不要管,直接拷贝。
粘贴到生产机器上,比如路径没更改,全部丢在生产机器上的 /home/workspace/packages 中
那么执行以下安装命令即可。
1pip install --no-index --find-links=/home/workspace/packages requests
然后巴拉巴拉,只要没看到 ERROR 的字样,便是成功。
需求因为需求关系,需要在生产机器上安装一些依赖,但是生产机器没有外网,所以就有了该篇。
本文以安装 gcc 为例子
过程最好是两台机子的环境大同小异,也就是测试环境上的机器,这样不会出错,我记得好象已有的环境用命令就会失败来着。反正我没遇到这情况,所以 pass。
首先,先在一台拥有外网的机器上,通过 yum 搞一下包
1yum install --downloadonly --downloaddir=/home/workspace/env/gcc gcc
然后你就会在 /home/workspace/env/gcc 中看到 rpm 包
把这些包拷贝到没有网络的机器中,然后执行安装一下即可
1rpm -ivh *.rpm --nodeps --force
本地式首先 download 代码
1git clone --bare 仓库A地址
然后 push 代码
1git push --mirror 仓库B地址
效果
包括提交记录,版本记录等等…..新仓库都会有了
前言最近有一个工作,就是写一个 shell 脚本,然后早晚一次去查服务器的部分指标,超过 xxx 的时候通知管理员。
就在我 shell 脚本实现了,且直接运行无误后,为了贪方便,直接在 crontab 里丢个脚本执行,第二天发现居然没有生效,于是有了这篇备忘。
正文经过查看 crontab 的日志(/var/log/cron),发现执行了,且没有返回异常。
于是开始怀疑是不是命令没执行成功,于是写了个简单的 shell,打印当前时间,在 crontab 加入任务后,发现真的不生效,mmp。
然后经过多次试验,验证了确实没有任何的环境变量。此时,第一反应就是直接把代码里调用了 linux 程序都写成绝对路径。看了下,放弃了(多啊 =_=)。
Emmmm……..
最后,头疼半天,突然想到配置完 JDK 环境后会载入一次配置,那我在 shell 脚本里载入会不会就可以了,于是我在 shell 脚本的第二行,加上了以下的一句
1source /etc/bashrc
完结撒花。
结言嗯,问题解决了。就是不晓得这种写法有什么弊处,我琢磨着重新载 ...
查看硬盘情况:
1df [-h]
查看内存使用情况:
1free -m
从第 x 行开始,显示 y 行:
1234ls | tail -n +x | head -n y## 从第 5 行开始,显示 10 行,即显示 5 - 14 行ls | tail -n +5 | head -n 10
显示 x 到 y 行:
1234ls | head -n y | tail -n +x## 显示 5 到 20 行ls | head -n 20 | tail -n +5
查看文件的第 x - y 行:
1234sed -n 'x,yp' filename## 显示 5 到 10 行sed -n '5,10p' filename
显示文件命中行的上下 x 行( 含命中行 ):
1grep -C n foo filename
显示文件命中行的上 x 行( 含命中行 ):
1grep -B n foo filename
显示文件命中行的下 x 行( 含命中行 ):
1grep -A n foo filename
xargs -i 和 -I:
1234 ...
代码走起
12345678910111213str="http://www.baidu.com/demo"# 从左计数到 start( 0 开始)截取 n 长度 ; ${string:start:length} ; length 不填则直接到最后echo ${str:0:4}# 从右计数到 start( 1 开始) 截取 n 长度 ; ${string:0-start:length} ; length 不填则直接到最后echo ${str:0-4:4}# 从指定字符串(第一个)开始截取,取右边全部 ${string#*chars}echo ${str#*/}# 从指定字符串(最后一个)开始截取,取右边全部 ${string##*chars}echo ${str##*/}# 从指定字符串(第一个)开始截取,取左边全部 ${string%chars*}echo ${str%/* ...
正文首先先说函数,emm….,没啥好说的,就是下面的样子。
123456方法名() {}# 调用的话直接抄一遍方法名即可方法名
然后是传参,分为1. 执行 sh 文件传参2. shell 代码中调用函数的 传参
首先先说执行 shell 文件传参
简单就是后面以空格分开,然后哒哒哒的把参数跟上就可以了,比如:
1sh start.sh a b c d
然后在 shell 程序以 $n 取即可,n 从 1 开始。例如 $1 取到的是 a,$2 取到的是 b。
然后是函数的参数传递,跟运行 shell 文件传参用起来差不多。
程序中函数内使用 $n,n 从 1 开始取。传参的话就在调用的时候以空格分开即可。
1方法名 a b c d
注意点如果函数传参的话,那么函数内的 $n 取到的是调用函数传的参数,在函数内是取不到调用 shell 文件传递的参数的,需要将参数设为变量再丢给函数使用。
举个栗子:
123456test() { echo $1}echo $1test
执行 sh test.sh 1 输出的结果会为下图,函数取到的为空。 ...
前言使用的时候发现 菜鸟教程的 shell 对于运算符的简单实例 中,没有对小数的大小判断,通过百度后啊,然后就有了该篇备忘。
正文12345678a=0.8b=0.7if [ $( expr "$a > $b" ) ]then echo 'a > b'else echo 'a < b'fi
解析使用的是 linux 拥有的一个 expr 这个玩意,有兴趣的可以直接在命令行玩玩。
设有 n1,n2 两个小数,要看谁大谁小就用以下命令,返回为 1 则为真。
expr n1 \> n2 等价于 echo n1 \> n2 bc
一些额外的东东
在过程中发现一个问题,如果使用的是 \> ,会导致一直判断的结果不正确?
目前的理解是因为在 命令行 使用时,是因为转义,但是在 shell 中,属于画蛇添足。
直接使用 >,也是会导致结果不正确,且一直生成 数字 为文件名的文件
因为是 $(),其实也是执行其中的命令,而 > 为将输出到右边的文件中,此时应当将 > ...










