常用易忘记命令

AWS EC2 Debian登录后切换到root用户

sudo -s

nodepadd++ 模糊查找替换

例如要替换sql中的所有AUTO_INCREMENT= 值为1,如果新从数据库导出的结构,该值因为是自增,一般每个表的值会不一样,想将sql导入一个新库,同时让该值设置为1。


CREATE TABLE `canal_jsc_bill_batch` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  ...
  KEY `idx_State` (`State`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=134191 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='物流商汇款批次表';

CREATE TABLE `canal_jsc_bill_info` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  ...
  KEY `idx_BatchSN` (`BatchSN`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1228689 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='对账单表';

切换查的模式为“正则表达式”。用\d来匹配数字

因为不知道最长的数字有多少个,可以先把\d的个数设置多一点,当达到某个长度无法查询出结果时,则表示超过了数字的长度,然后从长度减一开始查找替换。直至长度为一,全部完成替换

AUTO_INCREMENT=\d\d\d\d\d\d\d\d\d

# 大括号{}中的数字表示重复几次
AUTO_INCREMENT=\d{9}

其它匹配符号

符号
解释

\s

匹配空格. 注意,会匹配标记的末尾. 使用 [[:blank:]] 来避免匹配新一行。

\S

匹配非空白

\w

匹配单词字符

\W

匹配非单词字符

\d

匹配数字字符

\D

匹配非数字字符

\b

匹配单词边界. ‘\bW\w+’ 找到W开头的单词

\B

匹配非单词边界. ‘\Be\B+’ – 找到位于单子中间的字母’e’


Linux 手动释放内存

cat /proc/sys/vm/drop_caches
0
echo 1 > /proc/sys/vm/drop_caches

# 或者使用如下命令来配置
sysctl -w vm.drop_caches=1

drop_caches的值可以是0-3之间的数字,代表不同的含义: 0:不释放(系统默认值) 1:释放页缓存 2:释放[[dentries和inodes]] 3:释放所有缓存

有时在释放内存后,想将drop_caches的值改回0,会发现报如下错误

echo 0 > /proc/sys/vm/drop_caches
-bash: echo: 写错误: 无效的参数


echo 0 > /proc/sys/vm/drop_caches
-bash: echo: write error: Invalid argument

实际上只能使用值 1,2 和 3。没有值 0。启动清除缓存的触发器之后,缓存将立即再次开始缓存。


shell 批量注释

:<< + 一个字符串来标识注释的开头和结尾。则中间部分会全部注释。

#!/bin/bash

:<<eof
echo "1"
echo "2"
echo "3"
echo "4"
eof

echo "5"

延伸用法:

: 表示为空命令,即什么都不做,类似Python中的pass

if [ 0 -eq 0 ]; then
    :
else:
    echo "something~"

<< 可以用做菜单,例如如下脚本执行后会输出1 2 3条内容

cat <<Menu
1.List
2.Help
3.Exit
Menu

#ubuntu

ubuntu18.04 server 手动配置静态IP,使用netplan 严格注意yaml格式

ubuntu@ubuntu:~$ cat /etc/netplan/01-netcfg.yaml 
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
     version: 2
     renderer: networkd
	 # 以下为添加部分
     ethernets:
       ens160:	# 网卡名称,请通过ip ad命令查看
         addresses: [ 192.168.2.2/16 ]
         gateway4: 192.168.2.1
         nameservers:
             addresses: 
                 - "223.5.5.5"

改好配置之后

sudo netplan apply # 使之生效

linux正在运行的前台脚本切换到后台

Ctrl+Z	# 将正在前台运行的命令暂停至后台
jobs	# 查看所有在后台的任务信息
fg $NUM	# fg 加后台任务编号可以将后台暂停任务切回前台继续

有多个命令要写入同一文件

echo aa >> 1.log
echo bb >> 1.log
date >> 1.log

可以精简为

{
	echo aa
	echo bb
	date
} >> 1.log

shell中,引用某个命令的结果

建议使用$(),而不是`。同时$()建议用双引号引起来,防止命令被空格分割。不过在ubuntu上测试发现加上引号会影响for循环逐行读取

echo `ls | grep abc` > 1.log	# 旧	
echo $(ls | grep abc) > 1.log	# 新
echo "$(ls | grep abc)" > 1.log	# 最佳

shell中切换目录时,为防止目录不存在,导致后续命令执行错误

可以加上 ||。跟 && 的意思相反,此外,该用法还适用其它命令

cd /111 || exit	# 如果/111目录不存在,直接报错并退出脚本,不再执行后面的命令
echo $PWD

linux 用[[ls命令–显示指定工作目录下的内容及属性信息|ls命令]]查看当前目录下文件大小,还可以用[[du命令-统计文件大小]]

ls -lSh

https://www.google.com/ncr

NCR: no country redirect,google 的 url 参数,不根据国家位置重定向。


linux删除带特殊字符的文件

使用绝对路径加TAB补全文件名,例如tmp目录有一个--.xls文件

cd /tmp/
rm /tmp/--.xls

Linux 踢出登录用户

  • w # 查看用户操作命令

  • who -H # 查看用户登录地址及时间

  • pkill -u username # 踢出指定的所有用户

  • pkill -kill -t pts/0 # 根据用户访问进程踢出指定用户


[[yum命令]]安装选择版本

yum list --showduplicates kubeadm	# 查看指定软件用yum可安装的版本信息
kubeadm.x86_64		1.6.0-0		kubernetes 
kubeadm.x86_64		1.6.1-0		kubernetes 
kubeadm.x86_64		1.6.2-0		kubernetes 

yum install kubeadm-1.6.1-0

linux 下通过修改IFS来调整系统默认命令分隔符。可以用来处理linux中文件名有空格的问题。

IFS_OLD=$IFS  #將当前值保存
IFS=$'\n'	# 指定分隔符。 \n 用换行符当分隔符, IFS=$',' 逗号, IFS=$'"' 双引号 
for line in /home/user/test_file
do
	echo "$line"
done
IFS=$IFS_OLD  #恢復之前保存的值

#tar命令

[[Linux命令/tar命令–打包和备份的归档工具|tar命令]] 打包放到指定目录下

环境说明,需要打包的目录在 /tmp/ 下名为 test,打包后的压缩包放到 /usr/src/目录下

tar -czPf /usr/src/test.tar.gz /tmp/test	#需要使用参数 -P(大写)来允许我们使用绝对路径进行压缩打包
# -P don't strip leading `/'s from file names # 不要从文件名中删除前导“ /”

如果不加-P 或者 -P 参数在 -f 前,那就会报如下错误,虽然不影响打包结果,但说明命令格式是有误的。

tar -czf /usr/src/test.tar.gz /tmp/test
tar: Removing leading `/' from member names 

其它用法,参考[[Linux命令/tar命令–打包和备份的归档工具]]


shell 写成一行

每个命令之间用;隔开

while 和 for

ls | while read line; do echo $line;done
ls | grep 2019-12-02 | grep "name" | while read line; do cp $line /tmp/20191202_jscdb; done;
for line in `ls | grep 2019-12-02 | grep "name"`; do cp $line /tmp/20191202_jscdb; done;

if

if [ "$a"x = "1"x ]; then sh 1.sh & echo "123"; sh st.sh ;fi

for循环写成一行,每行之间用英文分号;隔开即可

例:以下a变量存储的结果为登录系统失败的IP,通过for循环依次打印出来。

a=`lastb -a | head -n -2 | awk -F ' ' '{print $NF}'`
for i in $a; do echo $i; done

在centos7中增加脚本开机启动的两种常用的方法:

  1. 修改/etc/rc.d/rc.local文件并修改配置

  2. 脚本放到/etc/rc.d/init.d目录下并进行配置

rc.local的用法

以linux下指定sun用户在linux开机时执行/home/sun/startrun.sh为例: 以root登录linux 执行vi /etc/rc.d/rc.local 在文档末尾添加一行语句:su sun -c "/home/sun/startrun.sh" 保存rc.local即可。

rc.local里面的命令开机自启不生效的原因:

/etc/rc.d/rc.local 文件默认没有可执行权限

chmod +x /etc/rc.d/rc.local 
# 给该文件添加可执行权限,系统启动后该文件里的命令即可自动执行

dirname去除文件名中的非目录部分,例如:

dirname /etc/my.cnf
/etc

[[uniq去重命令]]


1、利用Linux wheel组限制只有指定用户可以使用su提权至root

Linux系统下wheel相当于是一个管理员组,配合相应的配置文件可以指定只有该组的用户才能使用su提升至root权限。如果不修改配置文件,跟普通用户组一样

操作步骤

vi /etc/pam.d/su
	auth    required    pam_wheel.so use_uid	# 取消该行的注释,保存退出

vi /etc/login.defs
	SU_WHEEL_ONLY yes		# 在最后一行添加本行内容,指定只有wheel组可以使用su 命令

usermod -G wheel username	# 将username加入wheel组,username用户将有使用su命令提升至root的权限。

linux挂载windows共享目录

mount -t cifs //192.168.1.181/share /opt/windows -o username=administrater,password=123456
mount --bind 是什么意思? 
mount --bind 是将一个目录中的内容挂载到另一个目录上,用法是 
mount --bind src_dir dst_dir 

这个命令使得自己搭建的FTP要共享某个目录的时候变得特别方便。如果要取消mount用命令:

mount --move src_dir dst_dir 

如果mount --bind 也想写入fstab中的话格式如下:

vi /etc/fstab
src_dir dst_dir  none bind 0 0

centos6如何增加一个服务:

服务脚本必须存放在/etc/ini.d/目录下;放在该目录下的服务脚本即可使用service name start|stop|restart 来控制


cat iso > /dev/sdb  # cat 镜像名 > u盘位置   u盘位置无需挂载

启动 bind 时,需产生 rndc.key 文件,但长时间无响应

解决办法,建议先手动添加 rndc.key 文件 记得之前版本中, bind 默认会安装该文件,但导致每台机器 key 文件一致 可通过下面先方法手动生成文件

rndc-confgen -r /dev/urandom -a
write key file "/etc/rndc.key"

之后启动 bind 服务一切正常


linux 记录命令时间

vim /etc/profile
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  "

批量结束同一程序进程

以下为批量结束名为webbench的进程,cut -c 9-15 显示第9到15位的字符(也就是PID)。xargs命令用于读取前面的PID,并执行后面的kill命令

ps -ef | grep webbench | cut -c 9-15 | xargs kill

centos 7.3直接复制yum源文件到其它服务器,提示以下错误

……
Cannot find a valid baseurl for repo: webtatic/x86_64

是因为/var/cache/yum/x86_64/7/目录下没有对应的文件,要一并复制过去


Linux 配置http proxy

vi /etc/profile
	export http_proxy=127.0.0.0:8080
	export https_proxy=$http_proxy

source /etc/profile

给rm 命令加一个回收站

git clone https://github.com/lagerspetz/linux-stuff.git
sudo mv linux-stuff/scripts/saferm.sh /bin
rm -Rf linux-stuff

vi ~/.bashrc  
	# alias rm='rm -i'  #注释旧的rm命令别名
	alias rm=saferm.sh	#将rm命令设置为该脚本

回收站位置,以root为例,在/root/Trash目录下 为了防止长时间不清空,导致回收站文件过多,可以通过crontab来定期清理

crontab -e
0 0 */1 * * /usr/bin/rm -rf /root/Trash	#每天0点清除这个目录。

生成随机字符串的几种方法

openssl rand -base64 12
date +%s |sha256sum |base64 |head -c 12 ;echo
cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12

tomcat之一:指定tomcat运行时JDK版本

修改$TOMCAT/bin/setclasspath.sh,在最前面加入以下两行(tomcat8.5)

export JAVA_HOME=/usr/local/jdk1.8.0_191/
export JRE_HOME=/usr/local/jdk1.8.0_191/jre

Tomcat通过%D或%T统计请求响应时间

server.xml使用配置方式

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u [%{yyyy-MM-dd HH:mm:ss}t] %{X-Real_IP}i "%r" %s %b %D %F" />
  • %D 官方解释:Time taken to process the request, in millis,处理请求的时间,以毫秒为单位

  • %T 官方解释:Time taken to process the request, in seconds,处理请求的时间,以秒为单位

  • %F 官方解释:Time taken to commit the response, in millis,提交响应的时间,以毫秒为单位

java 环境变量配置

JAVA_HOME=/usr/local/jdk1.8.0_171
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

Linux环境下java项目后后台登录不了,加入以下环境变量

export CATALINA_OPTS="-Xms512m -Xmx1024m -Xmn768m -Xss2m -XX:NewSize=256M -XX:MaxNewSize=256m -XX:PermSize=256M -XX:MaxPermSize=512m -XX:-UseSplitVerifier"

查找、删除符合条件的文件

[[tail命令]]

tail -n 10	filename # 显示最后10行,等于tail -n -10 filename
tail -n +10 		# 从tail过滤出来的结果中第10行开始显示

例如,有个目录下每天会产生一个.log文件,现需要每天自动删除目录下超过7天的.log日志 思路:过滤出包含log关键字的文件名,并记录行数, 用-gt 判断是否大于7,如果大于7,则用tail -n +8 (用tail 从结果的第8行开始显示)筛选出日志名称,并用xargs 调用该结果,交给/usr/bin/rm -rf 进行删除 if [ ls -l | grep log | wc -l -gt 7 ]; then ls -lt | grep log | tail -n +8 | xargs /usr/bin/rm -rf fi

更合理的方式应该是用[[find命令–查找和搜索文件|find命令]]来判断

find /path/*.log -mtime +7 -exec rm -rf {} \;

[[head命令]]

head -n 10 filename # 显示前面10行,等于head -n +10 filename
head -n -10 filename # 不显示head结果的最后10行

shell整数比较

  • -eq # 等于;等于为true,不等于为flase

  • -ne # 不等于;不等于为true,等于为flase

  • -gt # 大于;大于为true,小于或等于为flase

  • -lt # 小于;小于为true,大于或等于为flase

  • -ge # 大于等于;大于等于为true,小于为flase

  • -le # 小于等于;小于等于为true,大于为flase


SWAP分区临时开关设置

swapoff -a	#临时关闭所有SWAP分区,重启后失效
swapon -a	#手动开启所有SWAP分区

永久关闭设置

vi /etc/fstab 
#禁用swap分区挂载项,并重启系统即可

linux登录提示信息修改

vi /etc/motd

最后更新于