编程周边辅助

发布时间 2023-10-21 12:42:31作者: 大浪淘沙、

Vim操作

删除空行

:g/^$/d

删除并包括空白

g全局命令对所有与地址匹配的行,%:代表这文件本身每一行,% == g/.*/

:g/^\s*$/d
:%s/^\s*$\n//

非贪婪匹配

.\{-}

vim查看当前与改动

:w !diff % -
# 然后如果还需要合并,那就只能:w一个新的文件,
# 然后两个文件使用vimdiff,手动操作合并到一个文件里面。
# :w filename 会将当前改动后的内容保存到filename文件
# :w !cmd 会将当前文件的内容以stdin给到后边的指令
# % 指代当前文件名因此,:w !diff % - 就是将当前文件内容以stdin给到
# diff % - 也就达到对比原文件和改动后的文件的效果

vim按照段落移动

# ):向前移动一条句子
# }: 向前移动一个段落

分组替换使用\转义(,并使用控制符号\U转换\1为大写

:%s/^\(.\{2\}\)/\U\1/g

创建删除折叠marker

:set fdm=marker
zf 创建marker
zd 删除当前行上存在的折叠标记

vim的分组替换

:s/\(.*\)=\(.*\);/\2=\1;/g

Makefile阅读实例

FILES = $(wildcard *.S)
# -------------------------------------------------------------------------------------------
objects = foo.o bar.o
all: $(objects)
    
%.o: %.c
	$(CC) -c $(CFLAGS) $< -o $@
# -------------------------------------------------------------------------------------------
src := acc bcc ccc
obj := $(src:cc=o)
test:
	@echo "obj => $(obj)"
# -------------------------------------------------------------------------------------------
src := a123b.c a234b.c ajkhb.c
obj := $(src:a%b.c=x%y)
test:
	@echo "obj => $(obj)"
# -------------------------------------------------------------------------------------------

$(patsubst %.c,%.o,value_list)
# -------------------------------------------------------------------------------------------
override A = 10
def:
        echo $(A)
# 防止外部的make命令对Makefile里的变量进行更改
# -------------------------------------------------------------------------------------------
include xxx.mk
# -------------------------------------------------------------------------------------------
# 强制编译
make -B
# -------------------------------------------------------------------------------------------
# 抽取路径、文件名
$ (dir names...)
$(notdir names...)
# -------------------------------------------------------------------------------------------
$(suffix names)
$(basename names...)
# -------------------------------------------------------------------------------------------
# 忽略错误继续执行
make -i
# -------------------------------------------------------------------------------------------
# 静默执行
make -s
# -------------------------------------------------------------------------------------------
# 判断包含字符串
mode = debug
hello: hello.c
ifneq (,findstring mode, $patten)
    @echo "find mode in patten" 
else
    @echo "not find"
endif
# -------------------------------------------------------------------------------------------
# Makefile中定义函数,使用define\endef
define output
	A=pwd#作为字符串输出
	A=`pwd`#作为字符串输出
	A=$(shell pwd)
	#只有这个A的值是pwd展开之后的值,但是
	echo $(A)
	#这句的输出是空的,上一句A=$(shell pwd)并不是存在一个被赋值的变量A
endef
all:
	$(call output)
# -------------------------------------------------------------------------------------------
# 输出makefile中的所有数据,包括所有的规则和变量。
# 且如果目标存在,那么其不会执行编译,目标不存在则报错。
make -pq
# -------------------------------------------------------------------------------------------
# 静默执行
$MAKE -s --no-print-directory

Bash编程阅读实例

for i in "$@"
do
   echo $i   #会经历$#次循环
done
# -------------------------------------------------------------------------------------------
for i in "$*"
do
   echo $i  #只会进行一次循环,如果$*没有加双引号则会进行$#次循环
done
# -------------------------------------------------------------------------------------------
usage() {
  echo "Usage: ${0} [-s|--start] [-e|--end] [-i|--scfid] [-g|--gene]" 1>&2
  exit 1 
}
while [[ $# -gt 0 ]];do
  key=${1}
  case ${key} in
    -s|--start)
      START=${2}
      shift 2
      ;;
    -e|--end)
      END=${2}
      shift 2
      ;;
    -i|--scfid)
      SCFID=${2}
      shift 2
      ;;
    -g|--gene)
      GENE=${2}
      shift 2
      ;;
    *)
      usage
      shift
      ;;
  esac
done
# -------------------------------------------------------------------------------------------
array=(bill   chen  bai   hu);
num=${#array[@]} //获取数组元素的个数。
for ((i=0;i<num;i++))
{
	echo ${array[$i]}
}
${#array[i]}  //获取数组某一个单元的长度
# -------------------------------------------------------------------------------------------
${array[*]}
for var in  ${array[*]}
do
echo $var;
done
${#var} //获取数组某一个单元的长度
# -------------------------------------------------------------------------------------------
function foo() {
   typeset -a arr=("$@")
   for e in "${arr[@]}"; do
      echo "element: $e"
   done
}
array=(aa bb cc)
foo "${array[@]}"
# -------------------------------------------------------------------------------------------
# typeset和declare相同。
# -i 定义整形
# -a 定义数组
# -A定义关联数组
declare -A array2
array2=([name]=zhangsan [sex]=male [age]=29)
# -------------------------------------------------------------------------------------------
for i in {0..9}; do
	echo $i
done
# -------------------------------------------------------------------------------------------
echo asdf | tr a-z A-Z
# -------------------------------------------------------------------------------------------
# 判断字符串相等。在[[ ]]中,变量的引用可以不加双引号;这是与[ ]的不同之处
test "$S1" = "$S2"
[ "$S1" = "$S2" ]
test "$S1" == "$S2"
[ "$S1" == "$S2" ]
[[ $S1 = $S2 ]]
[[ $S1 == $S2 ]]
# -------------------------------------------------------------------------------------------
cat /etc/passwd | sort -t ':' -k 3
#/etc/passwd 内容是以 : 来分隔的,以第三栏来排序
# -------------------------------------------------------------------------------------------
# 大写转小写
project_name=AAA
echo ${project_name,,} 
# -------------------------------------------------------------------------------------------
find ./ -type f -size +1M
# -------------------------------------------------------------------------------------------
# 当文件拷贝失败,则进行后续执行,执行:,返回永真。
cp ./src/*/*.h ./aaa 2>/dev/null || :
# -------------------------------------------------------------------------------------------
# file1文件内容减去file2文件内容,查看file1多出来什么内容。
grep -v -f file2 file1
file1:
line1
line2
line3
file2:
line1
line2
line4
line5
output:
line3
# -------------------------------------------------------------------------------------------
# 删除文本中重复的内容
# sort -u file1.log
# -------------------------------------------------------------------------------------------
# 获取某行
sed -n "1p"
# -------------------------------------------------------------------------------------------
# 字符串分割
echo $IN | tr ";" "\n"
# -------------------------------------------------------------------------------------------
# 以下的比较为字符串比较,当actual_size为21,不管大于还是小于,都成立。
echo $actual_size
if [[ $actual_size > 100 ]]
then
    echo "Big"
else
    echo "small"
fi
在[[中,>运算符进行字符串比较。因此,这是一个词典比较,而不是数字。在[中,>操作符是一个文件重定向。尝试:
[ "$actual_size" -gt 100 ]
[[ "$actual_size" -gt 100 ]]
这样是数字比较。
# -------------------------------------------------------------------------------------------
# 查看进程被哪个文件占用
fuser filename
fuser dirname
# -------------------------------------------------------------------------------------------
# 批量创建文件夹
# 使用xargs 指定-d的分割符号,然后才会创建三个文件夹,名为dir1、dir2、dir3。
# 使用-p,每次执行前确认。
# 使用-t,显示要执行的命令。
echo "dir1 dir2 dir3" | xargs mkdir
echo "dir1 dir2 dir3" | xargs -p mkdir
echo "dir1:dir2:dir3" | xargs -d ":" mkdir
echo "dir1 dir2 dir3" | xargs -t mkdir
# -------------------------------------------------------------------------------------------
# print0选项,则不打印回车了,取而代之是\0,即^@,也即null。
# xargs里的-0,则将管道得到的结果以null分割,即不分割。
# -0去掉则报错。sed命令中的.号匹配非0x0d字符,即非\n字符,
# \r字符结尾的行被清空。
# sed可以一次输入多个文件
find ./ -type f -print0 | xargs -0 sed -i 's/.$//'
# -------------------------------------------------------------------------------------------
# 以指定的增量输出文本,位宽为2,不足的地方填0,-f为格式化
# (没有%d,有%e,%g,%f)和sv的$display相似。
seq -f "%02g ddt" 1 10 > test.txt
# -------------------------------------------------------------------------------------------
# 打印指定行的内容
sed -n '5,10p' test.txt
awk 'NR>4 && NR<11' test.txt
tail -n +5 test.txt | head -6
# -------------------------------------------------------------------------------------------
# 删除a.txt中含"abc"的行,但不改变a.txt文件本身,操作之后的结果在终端显示
sed -e '/abc/d'  a.txt
# -------------------------------------------------------------------------------------------
# 批量修改文件名
# 目录下文件名为如下,要求去掉_finished。
# stu_102999_1_finished.jpg
# stu_102999_2_finished.jpg
# stu_102999_3_finished.jpg
# stu_102999_4_finished.jpg
# stu_102999_5_finished.jpg
# 方法1,该方法不太适合centos,因为centos有删减
rename "_finished" "" *.jpg
# 方法2,推荐,写脚本
for file in `ls *.jpg`;
	do mv $file `echo $file|sed 's/_finished//g'`;
done;
# 方法3,还行,是生成一堆命令后,用bash执行
ls *.jpg |awk -F "_finished" '{print "mv "$0" "$1$2""}'|bash
# -------------------------------------------------------------------------------------------
# grep找出不包含指定字符的文件名
grep 123 . -r -l 列出包含123的文件
grep 123 . -r -L 列出不包含123的文件
# -------------------------------------------------------------------------------------------
# 每次将n项输出
cat a | xargs -n 3
# -------------------------------------------------------------------------------------------
# 将参数传递给多个命令
cat 1.txt
A B C
cat 1.txt | xargs -I file sh -c 'echo file; mkdir file'
ls
A B C
# -------------------------------------------------------------------------------------------
# 命令并行执行,以4次为粒度
seq 10 | xargs -I {} -P 4 bash -c "echo start {}; sleep 3; echo done {}"
seq 10 | xargs -i -P 4 bash -c "echo start {}; sleep 3; echo done {}"
seq 10 | xargs -I {} --max-procs=4 bash -c "echo start {}; sleep 3; echo done {}"
# -------------------------------------------------------------------------------------------
grep -C 10 keyword catalina.out
# 显示file文件中匹配keyword字串那行以及上下10行
grep -B 10 keyword catalina.out
# 显示keyword及前10行
grep -A 10 keyword catalina.out
# 显示keyword及后10行
# -------------------------------------------------------------------------------------------
# find 查找使用not
find ! -name 'tmp'
# -------------------------------------------------------------------------------------------
# sed使用分组替换,使用-r选项,使能拓展正则
sed  -r -i 's/(PASS_MAX_DAYS)\s+([0-9]+)/\1 90/'  /etc/login.defs
# 将PASS_MAX_DAYS   99999替换为PASS_MAX_DAYS 90
# -------------------------------------------------------------------------------------------
# 取消和查看环境变量
unset VALUE
env | grep VALUE
# -------------------------------------------------------------------------------------------
# 对字符串做strip,使用echo命令
s=`echo " A BC  "`
echo $s
# A BC,是输出结果。
# -------------------------------------------------------------------------------------------
# 比较两个文件并输出相同部分的内容
grep -wf file1 file2
# 找出文件a中不在文件b中出现的内容:
grep -vf b a > 1.txt
# -------------------------------------------------------------------------------------------
# sed删除匹配行
sed -i '/asdf/d' a.txt
# -------------------------------------------------------------------------------------------
# 日期转数字
date -d "Nov  4 15:49:41 CST 2018" +%s
# 1541317781
# -------------------------------------------------------------------------------------------
# linux字符串包含,使用grep
[[ `echo "asdf #" | grep "#"` != "" ]]
# 使用字符串运算
[[ "asdf #" =~ "#" ]]
# -------------------------------------------------------------------------------------------
# linux判断文件是否存在
[[ -e filename ]]
[ -f $file_var ]	变量 $file_var 是一个正常的文件路径或文件名 (file),则返回真
[ -x $var ]	变量 $var 包含的文件可执行 (execute),则返回真
[ -d $var ]	变量 $var 包含的文件是目录 (directory),则返回真
[ -e $var ]	变量 $var 包含的文件存在 (exist),则返回真
[ -c $var ]	变量 $var 包含的文件是一个字符设备文件的路径 (character),则返回真
[ -b $var ]	变量 $var 包含的文件是一个块设备文件的路径 (block),则返回真
[ -w $var ]	变量 $var 包含的文件可写(write),则返回真
[ -r $var ]	变量 $var 包含的文件可读 (read),则返回真
[ -L $var ]	变量 $var 包含是一个符号链接 (link),则返回真
# -------------------------------------------------------------------------------------------
# sed命令,替换换行符"\n"
# 以下代码无效
sed "s/\n//g" file
# :a生成标记a,N为下一行合并当前行处理,s为替换指示。ta和a配合,t为test跳转,当中间部分替换成功,则继续执行。
sed ":a;N;s/\n//g;ta" a.txt
# b为branch跳转,中间部分无条件跳转执行。
sed ":a;N;s/\n//g;ba" a.txt
# -------------------------------------------------------------------------------------------
# bash某文本前或者后添加内容
# 使用sed命令,然后使用i和a,在第二个/的位置。i为之前,a为之后。
# 匹配行前加
sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file
# 匹配行前后
sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file
# 在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜杠:
sed -i '/2222222222/a\3333333333' test.txt
sed -i '/2222222222/i\3333333333' test.txt
# 把"hello"插入到第2行
sed -i '2i hello' sample.txt
# 把"hello"插入到最后一行
sed -i '$a hello' sample.txt
# -------------------------------------------------------------------------------------------
# 使用grep查找包括两部分的内容
grep -A 3 -B 3 'error' file1.txt file2.txt file3.txt | grep -B 3 'warning'
# -------------------------------------------------------------------------------------------
bash创建子进程
(
(command1 ; )&
command2 ;
...
wait ;
) &
wait
# -------------------------------------------------------------------------------------------
# 以树形结构显示程序和进程之间的关系
# -p	显示进程的 PID。
pstree
# -------------------------------------------------------------------------------------------
# 进程停止和恢复
kill -STOP 1234 将该进程暂停。 
kill -CONT 1234 恢复
# -------------------------------------------------------------------------------------------
# sed命令嵌套操作,使用N命令:Next 命令(N):将数据流中的下一行加进来创建一个多行组来处理。
[root@localhost ~]# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
[root@localhost ~]# sed '/first/{ N ; s/\n/ / }' data2.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
# -------------------------------------------------------------------------------------------
# tail 命令默认输出文件的最后10行,加上 +1 参数可以输出文件除第一行
# 以外的所有行。
tail -n +1 file.txt
# -------------------------------------------------------------------------------------------
# mail使用
z # 查看邮件列表
f num # 切换到某个邮件
空格 # 向下翻动
回车 # 向下翻动,超出则调到下一封邮件
# -------------------------------------------------------------------------------------------
# 将文件夹下所有文件名的from变成to
rename from to *
# -------------------------------------------------------------------------------------------
# bash内置的getopts工具了,用于解析shell脚本中的参数。
#!/usr/bin/env bash
# -n 名称
# -a 作者
# -h 帮助
# 有两个预先定义的变量,OPTARG表示选项值,OPTIND表示参数索引位置,类似于前面提到$1。
# n后面有:,表示该选项需要参数,而h后面没有:,表示不需要参数
# 最开始的一个冒号,表示出现错误时保持静默,并抑制正常的错误消息
# 该模式在识别到无效选项时,会命中?,且当前选项字符会保存在OPTARG中。
while getopts ":n:a:h" optname
do
    case "$optname" in
      "n")
        echo "get option -n,value is $OPTARG"
        ;;
      "q")
        echo "get option -a ,value is $OPTARG"
        ;;
      "h")
        echo "get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生"
        ;;
      ":")
        echo "No argument value for option $OPTARG"
        ;;
      "?")
        echo "Unknown option $OPTARG"
        ;;
      *)
        echo "Unknown error while processing options"
        ;;
    esac
    #echo "option index is $OPTIND"
done

./test.sh -a
# No argument value for option a
./test.sh -h
# get option -h,eg:./test.sh -n 编程珠玑 -a 守望先生
./test.sh -a 守望先生
# get option -a ,value is 守望先生
# 此时的OPTIND表示参数索引位置,$OPTIND得到的值为3.
# -------------------------------------------------------------------------------------------
# 对所有文件追加信息
# 使用xargs由于替换符号不识别,无法正常使用,替换符{}没有被替换
ls | xargs -I {} echo "xxxx" >> {}
# 使用tee命令,将数据追加到指定文件中
echo "xxxx" | tee -a `ls`
# -------------------------------------------------------------------------------------------
# echo 打印回车且使用双引号(单引号+-e似乎可以直接识别\n)
# 双引号注意前后必须有字符,如空格。打印的地方如果是变量,需要加上引号
str=`echo -e "aaa \n bbb"`
echo -e "$str"
# -------------------------------------------------------------------------------------------
# killall交互式删除,忽略大小写。
# -i选项。-i,交互式删除,-I,忽略大小写。
killall -i xxx
killall -I xxx

Linux操作

Bsub操作

https://www.ibm.com/docs/zh/spectrum-lsf/10.1.0?topic=bsub-options

bsub -J JOB_NAME -q nomal -m COMMAND

# 查看集群状态
lsid
# 查看队列状态
bqueues
# 查看结点负载
Lsload
# 查看5分钟内的作业详细信息
bjobs
# 一个作业完成5分钟后,只能使用bhist -l查看作业详情,之前作业详情是存储在内存中,完成后5分钟将被从内存中清除
bhist -a
bhist -l id

lspci

lspci -n 
-n :直接观察 PCI 的 ID 而不是厂商名称

lspci -v
lspci -vv
-v :显示更多的 PCI 接口装置的详细信息
-vv :比 -v 还要更详细的信息

lspci -s 04:00.0 -n
-s :后面接的是每个设备的总线、插槽与相关函数功能

lspci -s 04:00.0 -xxx
-x 查看基本配置空间
-xxx 查看配置空间
-xxxx 查看包括完整的配置空间

修改/tmp文件夹路径

https://blog.csdn.net/bi_hu_man_wu/article/details/61416306

修改TMPDIR并export(默认值看不到,默认值只有TMPPATH)

杂项

# 查看子进程18478对应的父进程号码
# 1号进程,又叫init进程
cd /proc/18478/status | grep PPid
# 刷新top的时间指定
top -d 5
# 修改时间
date -s 06/10/96

# linux的进程状态标记,内置一套软件转换状态机。
man ps,找CODES
# S:interruptible sleep(waiting for an event to complete)
# +:is in the foreground process group
# N:low-priority (nice to other users)
# T:stopped by job control signal