[TOC]
Linux常用命令
常用命令
1 | 切换目录 |
grep搜索文本,支持正则
参数
1 | grep [-acinv] [--color=auto] '搜寻字符串' filename |
例子
grep 2017010500345878 --color info.log
这行命令在info.log中搜索含有”2017010500345878”关键词的段落并且使用其他颜色标记关键词。
复制代码
grep -v 'ERROR' error.log
查找不含”ERROR”的行
grep -C 50 "关键字" info.log
less分页查看,比more更强
ps -ef |less
ps查看进程信息并通过less分页显示
搭配grep使用
less -N tomcat_stdout.log|grep job
less xxx.log | grep -i -n -C10 --color=auto xx
有用的命令
- 按F,监控更新.如果要暂停监控,可以CTRL+C.
- /字符串:搜索“字符串”的功能
- G:调到文本末尾
- 空格键 滚动一页
- 回车键 滚动一行
- Q: 退出
- gg: 调到文本最前面
- 按v进入编辑模式,可以类似于vim的方式来编辑保存文件了
其他有用的命令
1.全屏导航
- ctrl + F - 向前移动一屏forward
- ctrl + B - 向后移动一屏backward
- ctrl + D - 向前移动半屏
- ctrl + U - 向后移动半屏
2.单行导航
- j - 向前移动一行
- k - 向后移动一行
3.其它导航
- G - 移动到最后一行
- g - 移动到第一行
- q / ZZ - 退出 less 命令
4.标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:
- ma - 使用 a 标记文本的当前位置
- ‘a - 导航到标记 a 处
vi编辑文本
使用找一个字符串,在vi命令模式下键入“/”,后面跟要查找的字符串,再按回车。vi将光标定位在该串下一次出现的地方上。键入n跳到该串的下一个出现处,键入N跳到该串的上一个出现处。
tail查看文件后面几行,默认尾10行,可实时更新
-f 关键字,tail 会自动实时更新文件内容。
tail -f [logfile]
tail -n +100 [logfile]
查询从日志文件的第100行开始
tail -n 100 [logfile] | grep '结果' --color
–color是查询结果带颜色
head查看文件前面几行,默认前10行;
head -50 info.log
查看info.log文件的前50行。
head -n -100 [logfile]
查询日志文件除了最后10行的其他所有日志
cat查看文件
常用有三大功能:
- 1.一次显示整个文件;
- 2.从键盘创建一个文件。
- 3.将几个文件合并为一个文件。
-n 可以显示行号
1 | cat -n test.log |tail -n +63820|head -n 20 |
tail -n +63820表示查询63820行之后的日志
head -n 20 则表示在前面的查询结果里再查前20条记录
1 | cat -n info.log |grep "关键字" |more |
这样就分页打印了,通过点击空格键翻页
sed编辑文件
- 常见使用方法之: sed -n ‘800,900’ info.log
1 | 查看info.log文件800到900行之间的内容 |
常见组合使用
使用[grep -n 异常 –color info.log ]查询到异常在文件中发生的行数,然后再看前后几十行日志的内容[sed -n ‘800,900’ info.log].
Git使用总结
add与commit
首先,选择一个合适的地方,创建一个空目录
通过git init
命令把这个目录变成Git可以管理的仓库。可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的。
第一步,用命令git add
告诉Git,把文件添加到仓库:
第二步,用命令git commit
告诉Git,把文件提交到仓库:
1 | git add readme.txt |
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,也可以对一个文件进行不同更改
版本
git log
命令显示从最近到最远的提交日志,
1 | git log --pretty=oneline |
在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。
如果回到了原来的版本,git log看不到之前最新的提交记录了,但是git reflog还可以。只有知道版本号,就可还原之前的任何一个版本。
1 | git reset --hard HEAD^ |
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。
git status
可以查看一下状态,如果工作区进行了修改有没有add就会显示Untracked files
一个重要的概念是:Git跟踪并管理的是修改,而非文件。把文件git add readme.txt添加到了暂存区,暂存区也只是跟踪了这次修改,而不是跟踪了这个文件。换句话说:add不是一劳永逸之后对这个文件的更改都会被commit。如果再对readme.txt进行修改,就需要在进行一次git add,如果不再add,commit提交就不会提交这次修改。简而言之:每次修改都要进行git add。
删除文件:
1 | git rm test.txt |
如果是误删,版本库里还有,想恢复.git checkout
其实是用版本库里的最新版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
1 | git checkout -- test.txt |
分支
切换分支和撤销修改是同一个关键词checkout,确实有点令人迷惑,不过切换分支的checkout也可以用switch替换
1 | git checkout -b dev #创建并切换到dev分支 |
分支合并
在实习的时候我经常遇到这样尴尬的情况
比如:commit提交到本地分支了,切换到远程分支全没有了。解决办法:把本地和远程的分支和一下。
再比如:在我的分支上明明有的方法,与其他的预发分支合并也没问题。发上去应用构建居然报错找不方法???原来是别人发布了一次,此时主分支就和我不一样了。本地分支当然能看到该方法,切到构建分支发现并没有这个方法。解决办法:把我的分支和主分支合并一下
再再比如:
Commit之后切换分支了,就commit不了,显示没有变更。解决方法:嘿嘿还是分支合并就vans了,惊不惊喜意不意外?
那么问题来了,怎么万无一失的合并分支,并手动解决冲突?
git fetch
git checkout 分支一
git merge origin/分支二417c909ab76eb47c8fc033479904544054e8ea0e
解决冲突,有一些会自动合并,必须手动解决的会在控制台输入什么类。加上
<<<<<<<
,=======
,>>>>>>>
这种,跟着报错提示很容易找到地方。git add -u 记得重新add一下否则会提示冲突没有解决
git commit -m ‘XXXXX’
git push
git log –graph –pretty=oneline –abbrev-commit可以查看分支合并情况。
顺便说一下pull和fetch的区别
*git fetch
是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。*
而git pull
则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge
,这样可能会产生冲突,需要手动解决。
快速和并是看不出来曾经做过合并,禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
1 | git merge --no-ff -m "merge with no-ff" dev |
stash
bug分支,工作写到一半还不能提交,但是bug得马上先修的尴尬局面。
- git stash可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
git checkout -b issue-101
在修复bug的分支上创建临时bug分支- 修完后add+提交,切换会原来的分支,合并,最后删除
issue-101
分支。 git stash list
查看之前储藏起来的内容。用git stash apply
或者git stash pop
,恢复,后者会在恢复的同时删除stash。(list中的id号可以让你恢复指定的stash)- 如果其他分支也有该bug,git cherry-pick 4c805e2,
cherry-pick
能复制一个特定的提交到当前分支:
1 | git stash |
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
小技巧
code review已提交的代码,点击主分支右键compare with current。
强烈推荐这个教程,深入浅出.
https://backlog.com/git-tutorial/cn/stepup/stepup7_5.html
框架常用注解
spring
##
bean的注册
两种办法.
一、@Component或其派生 @Controller, @Service, @Repository注解
位置: 注解在类上
参数: 默认的bean的ID为首字母变为小写的类名
作用域:
通过上述四个注解标识的 Bean,其默认作用域是”singleton”。
如果不想是单例,使用@Scope 注解。只需提供作用域的名称就行了。
1
2
3"prototype") (
public class Demo { … }
@ComponentScan
- 作用: @ComponentScan对应XML配置形式中的<context: component-scan>元素, 用于配合一些元信息 Java Annotation,比如@Component和@Repository等, 将标注了这些元信息 Annotation 的 bean 定义类批量采集到 Spring 的IoC容器中, 我们可以通过 basePackages等属性来细粒度地定制 @ComponentScan自动扫描的范围, 如果不指定, 则默认 Spring框架实现会从声明 @ComponentScan所在类的 package 进行扫描。
二、使用@Configuration 搭配 @Bean注解。
常用在配置第三方提供的bean.
- @Configuration
- 位置: 注解在类上
- 作用: 声明当前类是一个配置类,相当于一个Spring配置的xml文件, 任何POJO+@Configuration都是一个JavaConfig配置类。 @Configuration也是一个@Component
- @Bean
- 位置: 注解在方法上
- 作用: 声明当前方法的返回值为一个Bean。
- @Configuration
1 | // 使用 @Configuration + @Bean 配置一个Tesla Service |
bean的获取
@Autowired 搭配 @Qualifier 或者 @Resource
@Resource和@Autowired使用起来区别不大, @Autowired优先byType装配, @Resource优先byName装配, 更多参考这里
@Autowired(required = false)找不到也没关系
问:如果属性注入找不到我不想让Spring容器抛出异常,而就是显示null,可以吗?答:将@Autowired注解的required属性设置为false即可
1 | ` false) (required = |
@Qualifier(“BMW”)接口有多个实现拿哪一个
问:一个Car接口有两个个实现,类Benz和BMW,要怎么拿?
1 |
|
@Autowired + @Qualifier(“foo”) 等同于 @Resource(name=”foo”)
bean生命周期
在某些情况下,可能需要我们手工做一些额外的初始化或者销毁操作,这通常是针对一些资源的获取和释放操作。
Bean的生命周期 @Scope @PostConstruct 和 @PreDestroy
@Scope指定bean的作用域.
1 | @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) or @Scope("prototype") |
生命周期的钩子
- initMethod & destroyMethod
- 位置: 与@Bean搭配使用
- 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
- 例子: @Bean(initMethod=”init”,destroyMethod=”destory”)
- @PostConstruct & @PreDestroy
- 位置: 与@Component搭配使用, 注解在方法上
- 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
- 例子: @PostConstruct public void init() {}
1 | // @PostConstruct & @PreDestroy 示例 |
@Value去配置文件取值
1 | "${env}") ( |
除了spring的application.properties,还会发现应用里对每一个环境都有不同的配置文件,诸如dev_config.properties、online_config.properties。
@Value取值先去application.properties,如果配置文件以@开头结尾,如env=@env@,则根据当前环境去对应的配置文件里取
SpringBoot
- @SpringBootApplication
- @Configuration
- 启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类
- @EnableAutoConfiguration
- 从classpath中搜索所有META-INF/spring.factories配置文件, 加载配置到spring容器
- 比如moguboot的spring.factories就配置了很多内部中间件
- @ComponentScan
- @Configuration
SpringMVC
- @RequestParam & @PathVariable 做参数绑定
- 默认绑定
- 请求参数名和方法参数名一致
- 使用RequestParam明确指定绑定关系
- @RequestParam(value=”age” required=false) required默认是true
- @PathVariable
- @RequestMapping(value=”users/{userId}, method=RequestMethod.GET)
- foo(@PathVariable(“userId”) long userId)
- 默认绑定
- @RequestBody
- 添加 @RequestBody 后 Spring 会根据请求中的 Content-Type 头信息来选择合适的转换器, 将请求数据转为 Java 对象
- 比如Content-Type是application/json, 那么就是 JSON -> Model
- @ResponseBody
- 添加 @ResponseBody 后 Spring 会根据请求中的 Accept 头信息来选择合适的转换器, Java 对象转化为客户端可接受的表述形式
- 比如Accept头部信息包含“application/json”, 就是Model -> JSON
- @RestController
- @RestController 等于 @Controller + 每个方法默认加@ResponseBody
Lombok
@Data,相当于*@Getter+ @Setter+ toString + EqualsAndHashCode + RequiredArgsConstructor.
@ builder 一个静态内部类https://juejin.im/post/5cfdf467f265da1b5d579fdd
@EqualsAndHashCode(callSuper = true)
测试
- @Test
- @Test注解标注这个方法需要测试
- @Before
- 所有的测试方法之前都先执行这个方法
- @After
- 所有的测试方法之后都要执行这个方法
- 还有@BeforeClass @AfterClass等注解
1 |
|
提升开发效率的技巧
idea
常用快捷键排行榜
- 复制一行Ctrl+D (光标所在行)
- 删除一行Ctrl+X (光标所在行)
- 选中的代码块注释 Ctrl + Shift + /
- 代码重新排列格式 Ctrl + Alt + L
- 全局替换 Ctrl+Shift+R
- 定位到下一个或上一个错误 F2 / Shift + F2
- Ctrl+Shift+F12 专注代码窗口
- Ctrl+E可以找到Recent Files最近浏览过的文件
- Ctrl + Shift + Z取消撤销
- Ctrl + Shift +回车:无论光标在哪,跳到下一行
- ctrl+alt+v:自动补全方法/new对象的返回值。
idea中git的使用
把idea项目关联为git仓库:菜单->VCS->import into Version Control->Create Git Repository->e:\project\hiworld-OK
如何热部署?
idea如何导入setting?
file -> export setting
将会导出一个 setting.jar 的文件
在新安装 IDEA 的电脑上,在开始的界面选择导入 setting
查看源码五件套
一次性折叠所有Java方法:ctrl +shift+ 减号
ctrl+鼠标单击某类 可以跳进该类查看源码
Ctrl+F12 显示这个类的方法的(弹出窗口)
alt + 7 显示这个类的方法的(左侧项目文件显示)
Ctrl+O,这个用于查看一个类的纲要,再按一次时,列出该类继承的方法及变量。
选中当前类中右击鼠标,右键菜单中选择Diagrams>Show Diagrams,快捷键Ctrl+Alt+Shift+U(不同的系统和快捷键风格快捷键会有差异)。如果是spring的类会出现如图所示的弹框,第一项是类图结构,第二个是spring beans的依赖
LINUX
常用命令
1 | 切换目录 |
云服务器
MobaXterm和Navicat,远程连接服务器和数据库,不用每次都登陆阿里云网站,很好用
cmd
在文件夹空白处按住Shift,然后右键弹出快捷菜单,可以看到“在此处打开命令行窗口”
使用上下方向键,翻看使用过的命令
cd 切换目录
例:cd // 显示当前目录
例:cd .. // 进入父目录
例:cd /d d: // 进入上次d盘所在的目录(或在直接输入:d:)
例:cd /d d:\ // 进入d盘根目录
例:cd d: // 显示上次d盘所在的目录
例:cd /d d:\src // 进入d:\src目录
例:cd prj\src\view // 进入当前目录下的prj\src\view文件夹
工具
Markdown工具
印象笔记:印象笔记也可以写md,体验一般
typora :md文件编辑器,用起来很舒服(本篇就是用它写的)
Writage 可直接将md文件打开为word,安装轻便。
资源搜索
盘搜搜:可以直接搜索网盘分享链接
闲鱼:盘搜搜搜不到的网盘链接,可以在里搜搜
其他
合并多个word/pdf/md文件为一个?
打开命令行cmd,输入下面这行命令,即可把E:\File目录下所有md文件合并成一个文件。
输入和输出路径不需要一样。
1 | type E:\File\*.md >> E:\File\margeFile.md |
端口被占用?
下面三行代码解决问题
打开cmd命令行窗口
第一行代码:查看端口号包含”80”的占用情况
第二行代码:根据上一步找到的80端口对应的pid是1828
结束java.exe
1 | netstat -ano|findstr "8000" |
md文件转pdf?
VScode安装插件后可以转。
#