Skip to content

Instantly share code, notes, and snippets.

@yuhangch
Last active August 10, 2020 06:41
Show Gist options
  • Save yuhangch/56a07e53580852266ee5a5a7e42fc95e to your computer and use it in GitHub Desktop.
Save yuhangch/56a07e53580852266ee5a5a7e42fc95e to your computer and use it in GitHub Desktop.
Notes Collection
title date draft
Shell Notes
2019-10-16 16:41:23 +0800
true

source 的替代方法

. ~/.zshrc

alias与其他命令重名,可执行原命令

\cmd
"cmd"
path/cmd

查看命令是内部命令还是外部命令

type cmd

依次执行命令

cmd1;cmd2;cmd3

上述可与sleep连用

sleep 10

结束后声音提醒

echo -e "\a"

短命令可可连写 ,顺序一定情况下可任意

ls -al
ls -a -l

彩蛋,1752 年 9 月

cal 9 1752

命令后面跟的引号不同的不同结果

echo echo $PATH # 当作普通字符串
echo 'echo $PATH' #什么都不识别
echo "echo $PATH" #识别变量
echo `echo $PATH` #识别命令,变量

#同样的
ls -l /bin
ls -l `echo $PATH`

看文档十六进制

hexdump -C filename

进制转换

echo "ibase=16;obase=2;6C49" | bc # 字母大写

字符集转换工具

iconv -l #查看字符集列表

帮助

man ascill
man ls
man mkdir

echo {} 排列组合

echo -e file{a,b,c}.{txt,log}"\n"

echo {1..100}

echo {1..10}
echo {a..z}

Tab 键补全

locate[Tab]

history 查看历史记录

history
!编号 执行指定命令
cat f1 f2
vi !$ # vi f2 最后一个参数
vi !* # vi f1 f2 所有参数
^str1 #删除上一条命令中的str1
^str1^str2 #将1换成2
!:gs/str/str1 #str 全替换成str1
[esc]松开 . # 上个命令最后一个参数
history -c #清除内存中的历史

google技巧

xxx filetype:pdf
xxx site:redhat.com/docs

执行文件

bash xx.sh # 不需要执行权限
cat xx.sh | bash #也能运行

shebang机制

#!/bin/bin sharp bang

文本处理

三剑客

cat 默认全显示,不分页

cat -n 加行号
    -sn 相邻空行压缩为一个
    -n 加所有空行
    -E 显示换行符,看空格
    -A 看tab等等
    
cat f1 f2 纵向合并

tac 反向显示/行

rev 反向 /列

More 分页查看

用管道分页显示

ll /etc | less

less 分页 到底不退出来/man 的分页器

head 前十行

head -number filename #默认
head -cNumber 前几个字节

tail 后十行 常用看日志

tail -n 3 
tail -f # 跟踪 #删掉之后不再跟踪
tail -F # 删除 新建 都能跟踪

tailf 文件增长时才访问文件,省资源

Cut 取列

cut -d: -f1,2,3-5

paste 纵向 合并

paste -s 旋转90度

wc 文本统计

seq 顺序输出

seq 1 10 > filename

sort

sort -t: -k1 fname
		 -u #删除重复
		 

uniq

uniq -c 统计重复几次
		 -d 重复的行
		 -u 都不一样的地方
		 
		 

diff

diff -u f1 f2

patch

patch -b f1 

grep/sed/awk/

grep 过滤数据 ,cut取列,grep取行

grep -v 不包含
grep -i 忽略大小写
	   -n 显示行号
	   -c 统计
	   -q 静默
	   -Ax 后续的几行
	   -Bx 前面的三行
	   -Cx 前面三行后面三行
	   -E 或者
	   -w 必须是个单词
	   -f 用文件匹配 过滤
	   -o 逐行输出

通配符 glob 文件名中的字符

*
?
[chen] c h e n 某一个字符
[^chen] 除了 c h e n
[0-9]数字
[[:digit:]] # 单个数字 lower upper ***

正则表达式

. 单个字符
[] 一定范围内单个字符 [wang] [0-9] [a-z] [a-zA-Z]
[^] 出了什么什么
[:alnum:] 数字字母
[:alpha:] 大小写字母
[:lower:]
[:upper:]
[:blank:] 空格和制表符 空白字符
[:space:] 水平和垂直的空白字符 比blank范围更大
[:cntrl:] 不可打印的控制符 退格 删除 警铃
[:digit:] 十进制数字
[:xdigit:] 十六进制数字
[:graph:] 可打印的非空白字符
[:punct:] 标点符号

a* a字符出现次数不确定
.* 任意长度任意字符
\? 前面字符0或1次
\+ 出现一次以上
\{n,m\} \{n\}  \{,m\} \{n,\} 匹配次数

#位置锚定
^ 中号外面 表示行首 不用转译???
$ 表示行尾
\<root\> 数字,下划线 可以包含在单词里
\broot\b

分组
\(abc\)\{n\} 
\(abc\).*\1 前面第一个分组 表示的是结果,不是模式本身

或
^\(a\|b\) 或表达式

  

vim

vim +10 f1 到行
vim +/^ft f1
vim -b 二进制
vim -d f1 f2 检查不同
vim -m 只读打开
vim -e 模式打开




:r /etc/f1 插入进来
:w f3 保存,另存为
:r!cmd 的输出

 

H  页首
M 页中
L 页尾
zt 上面 移动当前行
zz 中间
zb 下面
^行首非空 $行尾 0 force第一个

x 剪切
p 粘贴	
~ 转换大小写
J 删除这一行换行符
r 替换
R替换模式
dG 删除到最后
c 修改完进入插入模式

di" 在双引号中,删除内容
.,$d . 当前行
/^b/,/^f/d模式删除

/标黄去掉???
%s/ok/no/ %全文
--g全局
--gc 每次替换提醒

分隔符可以用# @ 等
&代表搜索的内容

U 这一行的初始状态


-b 二进制
%!xxd
title date draft tags categories
Git Notes
2019-06-25 18:33:03 +0800
true
git
笔记

跳过缓存区

git commit 添加 -a 选项,git自动把已跟踪的所有文件添加到缓冲区,然后再提交。这样就不用再执行 git add了。

设置别名

git 不会自动补全命令,设置别名简化操作

git config --global alias.** command

比如把文件从暂存区移出:

git config --global alias.unstage 'reset HEAD --'

之后之下两个命令就完全等价了

git unstage fileA
git reset HEAD --fileA

新建并切换分支

git checkout  -b [branch]

跟踪远程分支

git checkout -b [branch] [remotenama]/[branch]

跟踪远程分支简写

git checkout --track [remotename]/[branch]

查看跟踪信息

git branch -vv

ahead 意思是还为并入服务端,behind 落后提交

推送分支重命名

git push -u origin local:server

-u--set-upstream的缩写,能够配置分支以简化随后的工作。

submodule

hugo 博客管理的时候

public作为静态界面对应*.github.io仓库,在博客原仓库中:

git submodule add https://github.com/**.github.io.git public

这样就能更好地完成源码和静态文件的管理了。

title date draft tags categories
一些Java技巧简记
2019-12-16 16:32:01 +0800
false
java
笔记

研一到截止研二目前,经手了几个项目,这是一个Java后端过程中遇到的一些问题和解决方案。

JNA调用C++动态链接库

首先定义模型接口如下:

package ch.yuhang.XModel;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;

public interface XModel extends Library {
    XModel Instance = (XModel) Native.load(PATH_TO_MODEL_DLL, OSPModel.class);
    Pointer RunModel(String arg1, String arg2, String arg3);
}

PATH_TO_MODEL_DLL指向dll文件,可加后缀也可以不加。调用方式如下:

OSPModel ospModel = OSPModel.Instance;
Pointer string = XModel.RunModel(arg1, arg2 , arg3 );

支持返回结果,dll本身的命令行打印也会生效。

Java调用命令行阻塞的问题及异常处理

在项目过程中,因为要与其他功能集成,在动态链接库的形式之外,也有直接调用Python脚本和exe的情况,前期遇到了命令行首次可运行,第二次不能正常运行的情况,原因是打印出的内容阻塞了。采用下列方式处理,问题解决:

package ch.yuhang.XModel;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Cmd {
    public static int run(String command,String desc) {
        int re = 10;
        try {
            System.out.println(command);
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            re = process.waitFor();
            if (re == 0) {
                System.out.printf("%s --> success\n",desc);
            } else {
                System.out.printf("%s --> failed\n",desc);
            }
            return re;

        } catch (Exception e) {
            e.printStackTrace();
            return re;
        }

    }
}

两个参数,分别是包含命令和参数的字符串,和命令的描述(用于执行情况的打印),re = process.waitFor();返回值为0表明了任务顺利执行,反之出现异常。

参考自shendeguang博客

字符串格式化输出指定参数位置

在格式化输出时,有时候会有重复参数的情况,可用num$下列方法指定参数位置。

String format = "Hi ,%s %s,you first name is %1$s";
String message = String.format(format,"yuhang","chen");

Java将Json对象输出成INI配置文件

牵涉到之前的老旧功能,之前的项目采用.NET的方式,其中有的调用需要将配置项写成INI的形式,前端返回的数据是Json格式,这就牵涉到转换的方式,手动的写有点麻烦,于是找到了以下方法完成,大致思路是,遍历Object的字段,然后格式化输出keyvalue

package ch.yuhang.XModel;

import com.google.gson.Gson;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public static boolean writeINI(Object json,String uuid) throws NoSuchMethodException, InvocationTargetException {
        StringBuffer path = new StringBuffer(Path.EVAL_SHEET_TEMP);
        path.append(uuid).append(".ini");

        FileWriter w = null;
        try {
            File file = new File(path.toString());
            file.createNewFile();
            // true表示不覆盖原来的内容,而是加到文件的后面。若要覆盖原来的内容,直接省略这个参数就好
            //System.out.println(path.toString());
            w = new FileWriter(path.toString());

            Gson gson = new Gson();
            String a = gson.toJson(json);
            EvalSheet e = gson.fromJson(a, EvalSheet.class);
            Field[] fields = e.getClass().getDeclaredFields();

            for (Field f:
                    fields) {
                String name = f.getName();
                f.setAccessible(true);
                w.write(String.format("[%s]\n",name));

                try {

                    Object l =  f.get(e);
                    Field[] fsTmp = l.getClass().getDeclaredFields();
                    if (fsTmp.length == 0) {
                        continue;
                    }
                    for (Field f2:
                            fsTmp) {
                        f2.setAccessible(true);
                        String nameTmp = f2.getName();
                        //String typeTmp = f2.getGenericType().toString();
                        Method m = l.getClass().getMethod("get" + nameTmp);
                        String value = (String) m.invoke(l);    //调用getter方法获取属性值
                        if (value != null)
                        {
                            w.write(String.format("%s = %s\n",nameTmp,value));
                        }
                    }

                } catch (IllegalAccessException er ) {
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            return false;
        } finally {
            try {
                w.flush();
                w.close();

            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return true;

    }
title date draft tages categories
Postgresql Notes
2019-08-10 12:26:40 +0800
true
postgresql
笔记

pg在centos中的配置文件路径

/var/lib/pgsql/data/

查看postgresql 数据库用户

postgres=# \du

查看最大连接数

show max_connections;查看当前连接数

select count(1) from pg_stat_activity;

title date draft tags categories
Python Notes
2020-02-26 19:18:10 +0800
true
python
笔记

文件名不要和包名一致

vi flask.py
from flask import Flask # 引入失败,因为module名和文件名重复。

In some cases we may want to make a copy of the test data to avoid altering the original.

import shutil
path = shutil.copy('tests/data/RGB.byte.tif', '/tmp/RGB.byte.tif')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment