linux 常用基本命令

vim用法

VIM用法.png

Normal-mode

用于浏览文件,也包含复制,粘贴,删除等操作。这种模式下,键盘按键会当做功能键处理,不会真正的键入这些字符

漫游

  • h 向左
  • j 向下
  • k 向上
  • l 向右
  • 0 跳到行首
  • ^ 跳到行首第一个非空字符
  • $ 跳到行尾
  • gg 跳到文件的第一行的行首
  • G 快速到文件的最后一行的行尾
  • % 匹配括号移动,包括(,{,[
  • |# 匹配光标当前所在的单词,移动光标到下一个单词处,是下一个,#是上一个
  • ctrl+f 查看下一页内容
  • ctrl+b 查看上一页内容
  • 100G 跳转到第一百行的行首

复制

  • yy 复制光标所在整行
  • 100yy 复制光标坐在行及以下共100行
  • yw 复制光标开始的第一个单词
  • y$ 复制光标到行尾
  • yG 复制光标所在行到文本的结束
  • yH 复制文本开始到光标所在行的文本
  • fa 移动光标到本行下一个a的字符处
  • Fa 反前移动光标到字符a处
  • nfa 移动光标到下第n个字符a处
  • nFa 向前移动光标到第n个字符a处
  • ta 移动光标到a字符的前一个字符
  • nta 移动光标到第n个a字符前一个字符
  • Ta 向前移动光标到a字符出现的后一个字符
  • nTa 向前移动到第n个a字符出现后的一个字符
  • yfB 复制光标到第一个大写B中间的内容
  • y2fB 复制光标到第二个大写B中间的内容

剪切

  • x 向后剪切一个字符,如果是行尾则向前剪切
  • 3x 剪切三个
  • xp 非行尾交换两个字符,如果是bs编程sb

删除

  • dd 删除光标所在行
  • 200dd 删除光标所在行及以下共100行
  • dw 删除一个单词
  • dnw 删除n个单词
  • df" 删除到出现第一个双引号的位置
  • dnf" 删除到出现第n个双引号的位置
  • d$ 删除光标到本行的结尾
  • d^ 删除光标到本行的开头
  • dH 删除文本开始到光标所在行的文本
  • dG 删除光标所在行到文本的结束

粘贴

  • p 粘贴复制或剪切的内容
  • 3p 将复制或剪切的内容粘贴三次
  • P 光标前开始粘贴
  • 3P 光标前开始粘贴3次

窗口命令

  • ctrl+w s 水平分割窗口
  • ctrl+w w 切换窗口
  • ctrl+w q 关闭当前分屏,如果是最后一个分屏则退出VIM
  • ctrl+w c 关闭当前分屏
  • ctrl+w v 垂直分割窗口
  • ctrl+j|k 可以用于切换上下窗口
  • ctrl+h|l 可以用于切换s水平窗口
  • ctrl+w H|L 可以用于左右移动当前分屏
  • ctrl+w J|K 可以上下移动当前分屏

文件保存

  • ZZ 大写的字母ZZ,保存当前文件
  • ZQ 大写的字母ZQ, 放弃对文件的修改并退出

关键字和路径补全

  • ctrl+x -> ctrl+n 透过目前正在编辑的文件内容作为关键库补全
  • ctrl+n 也可以快速补全,没有提示
  • ctrl+x -> ctrl+f 以当前目录内的档案作为关键字补全路径文件
  • ctrl+x -> ctrl+o 以文件名作为语法补充,以wim内建的关键字予以补全

撤销操作和恢复

  • u 撤销刚才的操作
  • ctrl+r 恢复撤销操作

删除字符和替换

  • x 删除光标当前所在的字符
  • r 替换掉光标当前所在的字符
  • R 替换掉从光标开始以后的所有字符,除非退出

大小写转换

  • ~ 将光标下的字母改变大小写
  • 3~ 将光标位置开始的3个字母改变其大小写
  • g~~ 改变当前行字母的大小写
  • gUU 将当前行的字母改成大写
  • guu 将当前行的字母改成小写
  • 3gUU 将从光标所在行下面共三行字母改成大写
  • gUw 将光标下的单词改成大写
  • guw 将光标下的单词改成小写

宏录制以及播放

  • 录制宏,在普通模式按下q键(宏录制是以q键启动的),再按下字母w(字母随意),表示该宏注册为w, 然后完成操作后再次按下q表示完成录制操作。
  • 宏播放, 在正常模式下,按下@w执行宏录制的所有操作。@@是对上次宏的重复操作。n@w, 就会执行n次w宏。

Command-mode

在正常模式下按下":"(冒号)键或者/(撇号),进入命令模式,可以输入和执行一些VIM或者插件命令,这些指令包含设置环境,文件操作,调用某个功能

:%s/$/sth/ 行尾追加sth

:%s/^M//g 替换掉dos换行符,^M使用Ctrl+v+Enter即可输入

:g/^/s*$/d 删除空行以及只有空格的行

:n1,n2 s/str1/str2/gic 替换行号n1到n2之间的字符串str1为str2, g关键字表示一行出现多个,则都替换,如果没有g,则只替换第一个,i关键字表示大小写不敏感,即忽略大小写,大写的字母I表示大小写敏感,这也是默认的。c关键字表示替换前确认。每个关键词均可单独使用

:%s/#.*//g 删除#之后的字符

/hansen 查找字符串hansen, n查找下一个匹配, N查找上一个匹配,2n查找下面第二个匹配

:help set 查看set命令的帮助信息

:set 显示与系统预设值不同的设定参数,就是自己修改的那些设定

:syntax on|off 打开和关闭程序的语法高亮

:set bg=dark|light 设置不同的背景色

文件操作

  • :w 将编辑的内容写入文件中

  • :w! 将文件在只读状态时强制写入,实际写入还得看文档权限

  • :q 离开vim

  • :qa! 退出所有文件,对所有文件不做修改保存

  • :x 退出文件并保存对文件的修改

  • :e fn 打开另外一个文件

  • :n 跳转到下一个文件

  • :N 跳转到上一个文件

  • :bn 跳转到下一个文件

  • :bp 跳转到上一个文件

  • :ls 列出打开的所有文件

  • :b2 显示第二个文件

  • :q! 将至退出修改过的文件,丢掉所有修改

  • :wq 存储后退出

  • :w fn 将文件另存为文件名fn

  • :r fn 将fn文件读入并追加到目前编辑文件光标后

  • :n1, n2 w fn 将n1到n2的内容存储成fn文件

  • :n1,n2 d 将n1到n2行的所有内容删除,d是删除关键字

  • :! command 显示离开编辑器并执行command命令

  • :r! command 执行command命令,并将执行结果追加到光标后

  • :sp fn1 上下分屏打开另外一个文件

  • :vsp fn1 左右分屏打开另外一个文件

:set nu 开启显示行号

:set hlsearch 搜索到的关键字高亮

:set autoindent 开启自动缩进

:set backup 是否自动存储档案,当开启后,每次打开文件编辑的时候,原始文件会命名为fn~

:set ruler 打开后关闭右下角的状态栏说明

:set ic 在关键词搜索的时候区分大小写

:set showmode 打开和关闭模式切换后的状态,比如进入insert mode的时候,左下角会显示–INSERT–

:set backspace=(012) 进入编辑模式,可以利用backspace来按键来删除任意字符,但是某些distribution则不容许这样。此时可以通过设置backspace来实现这个功能,=2,就是删除任何字符,=0|1时,仅可以删除输入的字符,而无法删除原来文本存在的字符

tabe fn 使用VIM插件minibuffer新建标签页功能,在一个新的标签页编辑文件fn,

  • gt 切换到下一个标签页
  • gT 切换到上一个标签页
  • :tabr 切换到第一个标签页
  • :tabl 切换到最后一个标签页
  • :tabm [N] 把当前tab移动到第N个tab之后

:map ^M I# 设置快捷键Ctrl+m在光标处所在行的行首插入#(#代表注释),然后在退出编辑状态。map是关键字,后面的是key和value。key对应的是^M,这个key是快捷键Ctrl+v+M输入的,代表快捷键Ctrl+M。Value对应的是I#, 表示依次执行这些快捷键。I表示切换光标至行首并进入编辑状态,#表示输入#,表示退出编辑状态。

:ab email [email protected] ab是关键词,该命令执行后,然后切换到编辑模式,输入email后,会把email自动替换为邮件地址[email protected]。适用于频繁输入同样的长字符串场景

Insert-mode

在正常模式按下一些按键(如i, a等)进入插入模式
i 从当前光标的位置进入插入模式
I 进入插入模式,并将光标至于行首
a 追加模式,置光标于当前光标之后
A 追加模式,置光标于行末
o 在当前行之下新加一行,并进入插入模式
O 在当前行之前新加一行,并进入插入模式
ESC 退出插入模式

Visual-mode

可视化模式
按下v,V,+V, 可以进入可视化模式,操作像是拿鼠标选择一样,操作会很方便。
继续按下CTRL+v会退出可视化模式

使用方向键或者h,j,k,l进行漫游,选中相应的内容,也可以使用gg和G直接到文件首或尾

ctrl+v 块模式,块操作,和UE的块操作一样

o 跳转光标到选中块的另一个端点

U 将选中块中的内容转化为大写

O 跳转光标到块的另一个端点

aw 选中一个字

ab 选中{}括号中的所有内容,包含括号本身

aB 选中{}括号中的所有内容

ib 选中括号中的内容,不包含括号

iB 选中括号中的所有内容

va 当光标在"",’’,(),{},[]当中时候,va表示选中""内所有的内容包含双引号

vi 当光标在"",’’,(),{},[]当中时候,va表示选中""内所有的内容不包含双引号

块右移

< 块左移

y 复制块

d 删除块

~ 切换块中内容的大小写

在该模式下选择区域后直接输入:, VIM会自动补全为:’<,’> 这个是可视模式下选区的替换操作,表示操作范围,类似与制定n1, n2

vim编辑文本

vim file 编辑一个文件

vim fn1 fn2 … 同时编辑多个文件,默认只显示第一个文件,也就是file1

vim -on fn1 fn2 … 上下分屏同时编辑多个文件

vim -On fn1 fn2 … 左右分屏打开多个文件

基本操作

可能是这些命令太常用了,多打一个字符都是罪过。所以它们都很短,不用阿拉伯数字,一个剪刀手就能数过来。

image

看命令。
mkdir 创建目录 make dir
cp 拷贝文件 copy
mv 移动文件 move
rm 删除文件 remove
例子:

# 创建目录和父目录a,b,c,d
mkdir -p a/b/c/d

# 拷贝文件夹a到/tmp目录
cp -rvf a/ /tmp/

# 移动文件a到/tmp目录,并重命名为b
mv -vf a /tmp/b

# 删除tmp目录的所有文件
rm -rvf /tmp/

漫游

linux上是黑漆漆的命令行,依然要面临人生三问:我是谁?我在哪?我要去何方?
ls 命令能够看到当前目录的所有内容。ls -l能够看到更多信息,判断你是谁。
pwd 命令能够看到当前终端所在的目录。告诉你你在哪。
cd 假如你去错了地方,cd命令能够切换到对的目录。
find find命令通过筛选一些条件,能够找到已经被遗忘的文件。
至于要去何方,可能就是主宰者的意志了。

文本处理

这是是非常非常加分的技能。get到之后,也能节省更多时间来研究面向对象。小姐姐味道已经输出了“最常用的vim、sed、awk技巧系列”。

image

查看文件

cat
最常用的就是cat命令了,注意,如果文件很大的话,cat命令的输出结果会疯狂在终端上输出,可以多次按ctrl+c终止。

# 查看文件大小
du -h file

# 查看文件内容
cat file

less
既然cat有这个问题,针对比较大的文件,我们就可以使用less命令打开某个文件。
类似vim,less可以在输入/后进入查找模式,然后按n(N)向下(上)查找。
有许多操作,都和vim类似,你可以类比看下。

tail
大多数做服务端开发的同学,都了解这么命令。比如,查看nginx的滚动日志。

tail -f access.log

tail命令可以静态的查看某个文件的最后n行,与之对应的,head命令查看文件头n行。但head没有滚动功能,就像尾巴是往外长的,不会反着往里长。

tail -n100 access.log
head -n100 access.log

统计

sort和uniq经常配对使用。
sort可以使用-t指定分隔符,使用-k指定要排序的列。
下面这个命令输出nginx日志的ip和每个ip的pv,pv最高的前10

# 2019-06-26T10:01:57+08:00|nginx001.server.ops.pro.dc|100.116.222.80|10.31.150.232:41021|0.014|0.011|0.000|200|200|273|-|/visit|sign=91CD1988CE8B313B8A0454A4BBE930DF|-|-|http|POST|112.4.238.213

awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10

其他

grep
grep用来对内容进行过滤,带上--color参数,可以在支持的终端可以打印彩色,参数n则输出具体的行数,用来快速定位。
比如:查看nginx日志中的POST请求。

grep -rn --color POST access.log

推荐每次都使用这样的参数。

如果我想要看某个异常前后相关的内容,就可以使用ABC参数。它们是几个单词的缩写,经常被使用。
A after 内容后n行
B before 内容前n行
C count? 内容前后n行
就像是这样:

grep -rn --color Exception -A10 -B2   error.log

diff
diff命令用来比较两个文件是否的差异。当然,在ide中都提供了这个功能,diff只是命令行下的原始折衷。对了,diff和patch还是一些平台源码的打补丁方式,你要是不用,就pass吧。

压缩
为了减小传输文件的大小,一般都开启压缩。linux下常见的压缩文件有tar、bzip2、zip、rar等,7z这种用的相对较少。

image

.tar 使用tar命令压缩或解压
.bz2 使用bzip2命令操作
.gz 使用gzip命令操作
.zip 使用unzip命令解压
.rar 使用unrar命令解压

最常用的就是.tar.gz文件格式了。其实是经过了tar打包后,再使用gzip压缩。
创建压缩文件

tar cvfz  archive.tar.gz dir/

解压

tar xvfz. archive.tar.gz

快去弄清楚它们的关系吧。

日常运维
开机是按一下启动按钮,关机总不至于是长按启动按钮吧。对了,是shutdown命令,不过一般也没权限-.-!。passwd命令可以用来修改密码,这个权限还是可以有的。

image

mount
mount命令可以挂在一些外接设备,比如u盘,比如iso,比如刚申请的ssd。可以放心的看小电影了。

mount /dev/sdb1 /xiaodianying

chown
chown 用来改变文件的所属用户和所属组。
chmod 用来改变文件的访问权限。
这两个命令,都和linux的文件权限777有关。
示例:

# 毁灭性的命令
chmod 000 -R /

# 修改a目录的用户和组为 xjj
chown -R xjj:xjj a

# 给a.sh文件增加执行权限(这个太常用了)
chmod a+x a.sh

yum
假定你用的是centos,则包管理工具就是yum。如果你的系统没有wget命令,就可以使用如下命令进行安装。

yum install wget -y

systemctl
当然,centos管理后台服务也有一些套路。service命令就是。systemctl兼容了service命令,我们看一下怎么重启mysql服务。 推荐用下面这个。

service mysql restart
systemctl restart  mysqld 

对于普通的进程,就要使用kill命令进行更加详细的控制了。kill命令有很多信号,如果你在用kill -9,你一定想要了解kill -15以及kill -3的区别和用途。

kill -3 不会杀掉进程,kill -3 pid 后文件的保存路径为:/proc/${pid}/cwd
文件名为:antBuilderOutput.log

kill -15 pid
执行完该指令后,操作系统会发送一个 SIGTERM 信号给对应的程序。当程序接收到该信号后,可能会发生以下几种情况的一种:

  1. 当前程序立刻停止;
  2. 程序释放相应资源,然后再停止;
  3. 程序可能仍然继续运行。
    大部分程序会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,继续做其他一些事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出响应。也就是说,15) SIGTERM 是可能被阻塞、被忽略的。

kill -9 简单粗暴 直接杀掉进程

su
su用来切换用户。比如你现在是root,想要用xjj用户做一些勾当,就可以使用su切换。

su xjj
su - xjj

-可以让你干净纯洁的降临另一个账号,不出意外,推荐。

系统状态概览
登陆一台linux机器,有些命令能够帮助你快速找到问题。这些命令涵盖内存、cpu、网络、io、磁盘等。如需要更多了解,参考五件套。比较高阶一些。

image

uname
uname命令可以输出当前的内核信息,让你了解到用的是什么机器。

uname -a

ps
ps命令能够看到进程/线程状态。和top有些内容重叠,常用。

# 找到java进程
ps -ef|grep java

top
系统状态一览,主要查看。cpu load负载、cpu占用率。使用内存或者cpu最高的一些进程。下面这个命令可以查看某个进程中的线程状态。

top -H -p pid

free
top也能看内存,但不友好,free是专门用来查看内存的。包括物理内存和虚拟内存swap。

df
df命令用来查看系统中磁盘的使用量,用来查看磁盘是否已经到达上限。参数h可以以友好的方式进行展示。

df -h

ifconfig
查看ip地址,不啰嗦,替代品是ip addr命令。

ping
至于网络通不通,可以使用ping来探测。(不包括那些禁ping的网站)

netstat
虽然ss命令可以替代netstat了,但现实中netstat仍然用的更广泛一些。比如,查看当前的所有tcp连接。

netstat -ant

此命令,在找一些本地起了什么端口之类的问题上,作用很大。
工作常用
还有一些在工作中经常会用到的命令,它们的出现频率是非常高的 ,都是些熟面孔。

image

export
很多安装了jdk的同学找不到java命令,export就可以帮你办到它。export用来设定一些环境变量,env命令能看到当前系统中所有的环境变量。比如,下面设置的就是jdk的。

export PATH=$PATH:/home/xjj/jdk/bin

有时候,你想要知道所执行命令的具体路径。那么就可以使用whereis命令,我是假定了你装了多个版本的jdk。

crontab
这就是linux本地的job工具。不是分布式的,你要不是运维,就不要用了。比如,每10分钟提醒喝茶上厕所。

*/10 * * * * /home/xjj/wc10min

date
date命令用来输出当前的系统时间,可以使用-s参数指定输出格式。但设置时间涉及到设置硬件,所以有另外一个命令叫做hwclock

xargs
xargs读取输入源,然后逐行处理。这个命令非常有用。举个栗子,删除目录中的所有class文件。

find . | grep .class$ | xargs rm -rvf

#把所有的rmvb文件拷贝到目录
ls *.rmvb | xargs -n1 -i cp {} /mount/xiaodianying

网络
linux是一个多作业的网络操作系统,所以网络命令有很多很多。工作中,最常和这些打交道。

ssh
这个,就不啰嗦了。你一定希望了解ssh隧道是什么。你要是想要详细的输出过程,记得加参数-v

scp
scp用来进行文件传输。也可以用来传输目录。也有更高级的sftp命令。

scp a.txt 192.168.0.12:/tmp/a.txt
scp -r a_dir 192.168.0.12:/tmp/

wget
你想要在服务器上安装jdk,不会先在本地下载下来,然后使用scp传到服务器上吧(有时候不得不这样)。wget命令可以让你直接使用命令行下载文件,并支持断点续传。

wget -c http://oracle.fuck/jdk2019.bin

mysql
mysql应用广泛,并不是每个人都有条件用上navicat的。你需要了解mysql的连接方式和基本的操作,在异常情况下才能游刃有余。

mysql -u root -p -h 192.168.1.2

你可能感兴趣的:(linux 常用基本命令)