学习 Linux 笔记,常用命令,linux编程
文章目录
前言
linux是编程工作中必备的知识,若不懂linux 想要深入了解计算机行业确实是寸步难行!在学习中记录了常用的命令,方便今后的复习,全文章全部手敲,若有错误请指出。
一、关于Linux下的目录与快捷键
1、常用快捷键
主键盘快捷键: | |
---|---|
上 | Ctrl-p |
下 | Ctrl-n |
左 | Ctrl-b |
右 | Ctrl-f |
Del | Ctrl-d delete 光标后面的 |
Home | Ctrl-a first letter |
End | Ctrl-e end |
Backspace | Backspace |
清除整行 | Ctrl-u |
删除光标到行末 | Ctrl-k |
显示上滚 | Shift-PgUp |
显示下滚 | Shift-PgDn |
增大终端字体 | Ctrl-Shift-+ |
减小终端字体 | Ctrl- - |
新打开一个终端 | Ctrl-Alt-T |
清屏 | Ctrl-l 直接用clear也行 |
2、常用目录
/ | 根目录 |
---|---|
/bin | 存放二进制可执行文件 |
/boot | 存放开机启程序 |
/dev | 存放设备文件:字符设备、块设备 |
/home | 存放普通用户 |
/etc | 用户信息和系统配置文件 passwd、group |
/lib | 库文件:libc.so.6 |
/root | 管理员宿主目录(家目录) |
/user | 用户资源管理目录unix software resource |
/tmp | 临时文件目录 |
//sys | 系统信息 |
3、对用户的操作
su 进入管理员权限 | Ctrl+d 退出管理员权限 |
---|---|
sudo adduser username | 添加用户 |
sudo adduser username sudo | 追加管理员权限 |
sudo deluser username | 删除指定用户 |
sudo deluser username sudo | 删除指定用户的sudo权限 |
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、文件和目录管理
1、常用文件目录管理命令
10 | mount | 挂在一个文件系统 |
---|
长文件格式:drwxrwxrwx :d-文件,r-读,w-写,x-执行
第一组rwx-文件拥有这对文件的权限
第二组rwx-同一用户组的用户权限
第三组rwx -其他用户对文件的权限-rw-------- 1 root root 1024 09-30 12:00 filename
权限位、引用计数、所有者、属组、大小、最后一次修改时间、文件名
10、mount
mkdir /u01 #挂在文件系统前必须先创建一个目录
mount /dev/sdb1/u01 #再将文件系统挂在到目录上
#也可以把它添加到fstab中进行自动挂在,这样任何时候系统启动的时候,文件系统都会被加载
/de/sdb1/u01 ext2 defualts 0 2 #遗留问题
2.文件内容查看
序号 | 命令 | 功能 |
---|---|---|
1 | whereis | 可以查找某个命令的位置。eg:whereis ls |
2 | whatis | 显示某个命令的描述信息 |
3 | locate | 可以显示某个文件的路径,它会使用由updatedb创建的数据库 |
4 | find | find ./ -type d #搜索当前目录下文件类型是文件夹的文件 |
5 | cat | cat file #查看文件的内容 ;cat -n file #查看文件内容,并列出行号 |
6 | more | more file#查看文件内容,Enter建继续查看,q退出 |
7 | less | less file #查看文件内容,enter键查看剩余内容、↑回看,q退出 |
8 | head | head -n 20 file #显示文件前20行;-20 后20行,默认前10行 |
9 | grep | grep -r ‘copy’ ./ -n 查找当前目录下所有文件中含有copy内容的文件,-n显示行号 |
10 | xargs | 对查找后的命令进行操作 |
11 | tail | tail -n N [-f] filename 显示最后N行内容 |
12 | man | 系统命令参考手册 |
find ./ -name “filename” 按文件名搜索
find ./ -maxdepth 1 -name ‘*.jpg’ 指定搜索深度
find /home/itcast -size +20M -size -50M 按文件大小搜索. 单位:k、M、G
这里要注意,两个size一个都不能少,还有就是文件大小单位对大小写敏感
xargs 命令
find … | xargs ls -l 对find操作的结果集进行操作
等价于:
find … -exec ls -l {} ;
两者最大的区别是党结果集合很大的时候,xargs会对结果进行分段处理,所以性能好些,但是xargs也有缺陷,axrgs默认用空格来分割结果集,当文件有空格的时候,会因为文件名被切割失效
12、man
语法: man [num] commandname
man crontab #显示crontab 命令的man页面
num 可以分为8钟命令类型
序号 | 内容 |
---|---|
1 | 用户命令 |
2 | 系统调用 |
3 | c库函数 |
4 | 设备与网络接口 |
5 | 文件格式 |
6 | 游戏与屏保 |
7 | 环境、表、宏 |
8 | 系统管理员命令和后台运行命令 |
whatis crontab #先使用whatis命令查看有哪几种命令类型
man 5 crontab #再使用man查看
3、Linux 文件权限设置
序号 | 命令 | 功能 |
---|---|---|
1 | chown | 修改文件所者和所属组 |
2 | chgrp | 修改文件用户组 |
3 | chmod | 改变文件和目录的权限 |
1、chown
sudo chown username:groupname filename //同时修改文件所属用户和用户组
sudo -R username:groupname /home/filename //进行递归修改
2、chgrp
sudo chgrp groupname filename //修改文件所属用户组
3、chmod
//给指定文件的属主和属组所有权限(包括读、写、执行)
$ chmod ug+rwx file.txt
//删除指定文件的属组的所有权限
$ chmod g-rwx file.txt
//修改目录的权限,以及递归修改目录下面所有文件和子目录的权限
$ chmod -R ug+rwx file.txt
4、vim 编辑器
vim +10 filename.txt #打开文件并跳到第10行
vim -R /filename #只读迷失打开文件
定位:
命令 | 英文 | 功能 |
---|---|---|
gg | go | 跳转首行 |
G | go | 跳转末行 |
数字gg | go | 移动到 数字 对应行数 |
0(数字) | 光标移动到首行,工作模式不变 | |
¥ | 光标移到行尾,工作模式不变 |
撤销恢复
命令 | 英文 | 功能 |
---|---|---|
u | undo | 撤销上次命令 |
Ctrl+r | redo | 回复撤销的命令 |
删除
命令 | 英文 | 功能 |
---|---|---|
s | 删除光标所在行字符并进入编辑模式 | |
S | 栓出光标所在行并进入编辑模式 | |
x | 删除光标所在字符,工作模式不变 | |
dw | delete | 删除光标所在的单词,要求光标在首字母上,如果不再首字母,只会删除当前位置到单词末,工作模式不变 |
r | r删除光标所选中的字符 | |
dd | delete | 剪切光标所在行 |
D | delete | 删除光标所在位置至行末,工作模式不变 |
d0 | 删除光标所在位置到首行,工作模式不变 | |
d$ | 删除光标所在位置到行末,工作模式不变 |
进入编辑器命令
命令 | 英文 | 功能 |
---|---|---|
i | insert | 光标前插入字符 |
I | insert | 光标所在行的首行插入字符 |
a | append | |
A | append | 光标所在行的行末插入字符 |
o | 光标所在行的下一行插入字符 | |
O | 光标所在行的上一行插入字符 |
命令模式下的光标移动
命令 | 英文 | 功能 |
---|---|---|
h | 左 | |
j | 下 | |
k | 上 | |
l | ||
% | 在命令模式下,光标处于大空号时,使用%跳转到对应的大括号处 |
自动缩进
在这之前要进行vimrc修改,不然自动缩进是8个空格
ubuntu的vimrc位置在/etc/vim/vimrc
在文件末尾添加三行:
set tabstop=4 //设置制表符宽度为4
set softtabstop=4 // 设置软制表符宽度为4
set shiftwidth=4 // 设置缩进空格数为4
gg=G (命令模式),无回显
命令 | 功能 |
---|---|
yy | 复制光标所在行 |
p | 向后粘贴剪切板内容,如果复制整行,这里时粘贴在光标所在位置的下一行 |
P | 向前粘贴剪切板内容,如果是整行,这里时粘贴在光标所在位置的上一行 |
n-yy | 复制光标所在位置的n行,包括光标所在行 |
查找和替换
1、查找
命令 | 功能 |
---|---|
/ +findname | 命令模式下查找 |
按回车键气筒查找后,按n,会自动找下一个,N跳到上一个 |
查找光标所在单词
光标在目标单词上时,*或# 查找下一个,这里不要求光标必须在首字母上。
替换:末行模式下进行
单行替换
光标置于代替换行, :s /代替换词/替换词
全文替换
命令 | 功能 |
---|---|
:%s /待替换词/替换词 | 这个默认替换每行的首个,一行有多个目标词时,后面的不会变 |
:%s /待替换词/替换词/g | 真正意义上的全局替换 |
区域替换
命令 | 功能 |
---|---|
:24,35s /待替换词/替换词/g | 替换24-35行之间的目标词 |
末行模式下历史命令
命令 | 功能 |
---|---|
Ctrl-p | 上一条命令 |
Ctrl-n | 下一条命令 |
保存退出
命令 | 英文 | 功能 |
---|---|---|
w | write | 保存 |
q | quit | 退出,如果没有保存不允许退出 |
q! | ||
wq | write & quit | 保存并退出 |
x | 保存并推出 |
vim更多命令详情:vim终端编辑器快速入手详细指南
4、 软件包安装和卸载
1、安装
sudo apt-get install softname
2、更新
sudo apt-get update
3、卸载
sudo apt-get remove softname
5、压缩命令
1、gzip和bzip2
两这都是配合tar打包命令使用
这两个压缩的缺陷都是只能对单个文件进行压缩, 一不能压缩目录,而不能打包
gzip 只能压缩文件,不能压缩目录,后缀名为.gz,而且不保留源文件
gzip filename //压缩文件
gzip -d filename.gz //解压文件
gunzip filename.gz //解压文件
bzip2 压缩解压文件
参数 -k:刹那生压缩文件后保留源文件(压缩比高)
bzip2 filename //压缩文件
bzip2 -d filename.bz2 //解压文件
2、zip和tar 压缩
zip
语法:zip 选项[-r] [压缩后文件名称][文件或目录]
zip filename.zip /root/home/filename zip压缩后的文件名 压缩文件
zip -r filename.zip /test 压缩目录
unzip filename.zip 解压文件
tar
语法:tar [-zcf] 压缩文件名 文件或目录-c 建立一个压缩文件的参数指令(create),后缀是.tar
-x 解开一个压缩文件的参数指令(extract)
-z 以gzip命令压缩/解压缩
-j 以bzip2命令压缩/解压缩
-v 压缩的过程中显示文件(verbose)
-f file 指定文件名,必选项tar -zxvf 文件名 解压的
tar -zcvf 文件名 压缩的
tar -tvf 文件名 查看
三、系统配置命令
1、网络命令
序号 | 命令 | 功能 |
---|---|---|
1 | ifconfig | 用于查看和配置Linux系统的网络接口 |
2 | ping | 检测与主机是否连通 |
3 | ssh | 登陆远程主机 |
4 | ftp | 链接ftp服务器并下载多个文件 |
5 | traceroute | |
6 | talnet | |
7 | rcp | |
8 | scp |
1、ifconfig
ifconfig -a #查看所有网络接口及其状态
ifconfig eth0 up #启动eth0接口
ifconfig eth0 down #关闭eth0接口
2、ping
ping -c 5 baidu.com #ping百度主机,只发5个包
3、ssh
ssh -1 洪湖吗 主机地址 #登陆
ssh -v -1 jsmith 地址 #调试ssh客户端
ssh -V #显示ssh客户端版本
4、ftp
ftp IP/hostname
2、性能优化和监控命令
序号 | 命令 | 功能 |
---|---|---|
1 | top | 显示当前系统中占用资源最多的一些进程(默认以CPU占用率排序) |
2 | free | 显示系统当前内存的使用情况,包括已用内存,可用内存和交换内存的情况 |
3 | vmstat | |
4 | iostat | |
5 | shutdown | 关机命令 |
6 | uname | 可以显示一些重要的系统信息,例如:内核名称、主机名、内核版本号、处理器类型等信息 |
1、top
top -u username #显示username用户的进程
2、free
free #默认以字节方式显示内存的使用情况
free -g #以GB为为单位输出内存的使用情况。-g GB,-m MB, -b B字节
free -t #显示内存情况的总汇
5、shutdown
shutdown -h now #关闭系统并立即关机
shutdown -h +10 #10分钟后关机
shutdown -r now #立即重启
shutdown -Fr now #重启期间强行进行系统检查
6、uname
uname -a #显示系统重要信息
3、磁盘存储
序号 | 命令 | 功能 |
---|---|---|
1 | df | 显示文件系统的磁盘使用情况,默认情况下df -k 将以字节为单位显示磁盘的使用情况 |
2 | du | |
3 | mysql | mysql 是linux最钢钒的数据库,可以使用mysql客户端链接远程MySQL服务器 |
1、df
df -k #以字节为单位显示磁盘使用情况
df -h #以人类阅读习惯方式显示磁盘使用情况
df -T #显示文件系统类型
2、du
3、mysql
mysql -u root -p -h 192.168.1.2 #远程连接数据库
mysql -u root -p #连接本地数据库
四、其他命令
序号 | 命令 | 功能 |
---|---|---|
1 | ln | 创建软连接或者创建硬连接 |
2 | diff | 比较是忽略空白字符 |
3 | sort | 对文件进行排序 |
4 | date | 显示或设置系统日期 |
5 | wget | 下载软件,音乐,视频 |
6 | export | 输出设置全局变量 |
7 | ps | 命令用于显示正在运行中的进程的信息 |
8 | service | 运行System Vinit脚本,这些脚本一般位于/etc/init.d 文件下 |
9 | kill | 终止一个进程 |
10 | crontab | 某个用户的crontab入口 |
11 | passwd | 修改密码 |
12 | yum | 安装卸载apache |
13 | rpm | 安装卸载apache |
14 | env | 环境变量 |
15 | top | 文字版任务管理器 |
16 | jobs | 查看操作系统当前运行了哪些用户作业 |
17 | alias | 设置别名 |
1、ln
ln -s file file.s #创建一个软链接
#软连接就像windows下的快捷方式
#linux下的软件行为和windows下的快捷方式差不多,但
#是如果是相对路径创建的软连接,在软连接移动之后就会失效,无法访问
#而windows快捷方式不同,windows快捷方式随便移动
#所以创建软连接最好使用绝对路径
ls -s /home/mydir/file file.s2 #绝对路径下的软连接,移动后不会失效
ln file file.h #创建一个硬连接
#创建硬连接后,文件的硬件计数+1
stat file #查看文件状态
stat file.h#查看文件状态
#在显示的信息中文件和硬连接的Inode是相同的,每个文件都有唯一的Inode,他们就是同一个文件
#当创建硬连接是硬链接计数+1,删除时计数器-1,直到计数器为0是才会删除这个文件
2、diff
diff -w filename1 filename2
3、sort
4、date
data -s "mm/dd/yy hh:MM:ss" #修改系统时间
#需要同步硬件时间和系统时间
# hwclock -systohc
# hwclock --systohc -utc
5、wget
wget http://prodiwnloads.sourceforge.net/nogios.tar.gz
#下载文件并以指定的文件名保存文件
wget -0 taglist.zip http://www.vim.org/scripts/download_script.php?src_id=7701
6、export
7、ps
ps -ef | more #查看当前正在运行的所有进程
ps -efH | more #以属性结构显示当前正在运行的进程,H选项标识显示进程的层次结构
8、service
service ssh status #查看服务状态
service --status-all #查看所有服务状态
service ssh restart #重启服务
9、kill
#通常会先用ps -ef查找某个进程得到他的进程号,然后再使用kill -9 进程号 终止该进程
ps -ef | grep vim #查找vim的进程
kill -9 进程号 #终止进程
10、crontab
?
crontab -u username -l #查看某个用户的crontab 入口
#设置每10分钟执行一次的计划任务
*/10**** /home/ramesh/check-disk-space
11、passwd
passwd #修改当前用户密码
#超级管理员权限可以修改其他用户的密码
passwd username
passwd -d username #超级管理员可以删除一个用户的密码
12、yum:Ubuntu 中未找到该命令
#使用yum安装apache
$ yum install httpd
#更新apache
$ yum update httpd
#卸载/删除apache
$ yum remove httpd
13、rpm
#使用rpm安装apache
rpm -ivh httpd-2.2.3-22.0.1.el5.i386.rpm
#更新apache
rpm -uvh httpd-2.2.3-22.0.1.el5.i386.rpm
#卸载/删除apache
rpm -ev httpd
14、env
env | grep SHELL #查看SHELL的环境变量
16、alias 别名 =’指令‘
alias pg=’ps oem | grep‘ #设置别名
pg abc #找到oem 用户下的 abc的进程
五、编程常用命令
1、gcc 编译命令
参数 | 功能 |
---|---|
-I | 指定头文件所在目录位置 |
-c | 只做预处理、编译、汇编。 得到二进制文件 |
-g | 编译时添加调试文件,共gdb调试 |
-Wall | 显示所有警告信息 |
-D | 向程序中“动态”注册宏定义 |
-l | 指定动态库库名 |
-L | 指定动态库路径 |
当头文件和源码不在一个目录下时,需要指定头文件
用 -I 参数指定头文件所在位置,位置可以在编译文件前,也可以在后面
其中 -o是为编译文件起一个别名
gcc —I ./headDir hello.c -o myHello
2、动态与静态库
名称 | 功能 |
---|---|
静态库 | 对空间要求较低,对时间要高 |
动态库 | 对空间要求高,对时间要求低 |
制作静态库-静态库在应用程序生成时,可以不必再编译,节省再编译的时间。
ar rcs [lib库名.a] file1.o
#库必须以lib开头,静态库必须以.a结尾
#file.o是实现库中的功能文件
#1、将.c生成 .o文件
gcc -c add.c -o add.o
#2、使用ar工具制作静态库
ar rcs libMyMath.a add.o
#3、静态库的使用:
gcc test.c lib库名.a -o a.out
将静态库封装成.h的头文件
在头文件中有库函数中的声明
#ifndef _MYMATH_H_
#define _MYMATH_H_ //防止在代码中多次include头文件,多次展开静态库,带来额外的开小
int add(int,int);
int sub(int,int);
double div1(int,int);
#endif
动态库的制作生成与位置无关的代码
#1、生成位置无关的.o文件,使用-fPIC参数后,生成的汉书就和位置无关,挂上@plt表示,等待动态绑定
gcc -c add.c -o add.o -fPIC
#2、使用 gcc -shared 制作动态库
gcc -shared -o lib库名.so add.o sub.o div.o
#3、编译可执行程序时指定使用的动态库。 -l:指定库名 -L:指定库路径
gcc test.c -o a.out -l mymath -L ./lib
#4、运行可执行程序
./a.out
#报错
hjc@hjc-Master:~/myCode/lib$ ./a.out
./a.out: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory
报错原因
连接器:工作连接阶段:工作时需要 -l 和 -L
动态连接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置
1、#通过环境变量来指定动态库所在目录位置
export LD_LIBRARY_PATH=./lib #临时生效
#运行执行程序
./a.out #解决报错了
2、#永久生效,写入终端配置文件。 .bashrc
vi ~/.bashrc
写入export LD_LIBRARY_PATH=动态库路径 (建议使用绝对路径)保存
. .bashrc 或者重启 终端-->让修改后的.bashrc 生效。```
3、# 拷贝自定义动态库 到/lib 系统库中
4、#配置文件法
sudo vim /etc/ld.so.conf
写入 动态库的绝对路径 保存
sudo ldconfig -v 使配置文件生效
./a.out ---》ldd a.out 查看
3、gdb调试基础指令
参数 | 功能 |
---|---|
-g | 使用该参数编译可以执行文件,找到调试表。 |
list | list 1 列出源码。根据源码指定 行号设置断点。 |
b | b 20 在20行位置设置断点 |
r/run | 运行程序 |
n/next | 下一条指令(会越过函数) |
s/step | 下一条指令(会进入函数) |
p/print | p i 查看变量的值 |
continue | 继续执行断点后续指令。 |
finish | 结束当前函数调用 |
quit | 推出gdb当前调试 |
set follow-fork-mode child | 命令设置gbd 在fork之后根中子进程 |
set follow-fork-mode parent | 设置跟踪父进程 |
其他指令:
参数 | 功能 |
---|---|
run | 使用run查找段错误出现位置。 |
set args | 设置main 函数命令行参数(在start、run之前) |
run 字符串1 字符串2… | 设置main 函数 命令行参数 |
info b | 查看断点信息表 |
b 20 if i=5 | 设置条件断点 |
ptype | 查看变量类型 |
bt | 列出当前程序正存活的栈帧 |
frame | 根据栈帧编号,切换栈帧 |
display | 设置跟踪变量 |
undisplay | 取消设置跟踪变量,使用跟踪变量的编号 |
clear n | 清除第n行的断点 |
#程序在汇编时必须添加 -g 参数
gcc test.c -o test -g
gdb test #进入调试系统
常见错误说明 没有符号被读取——编译时每家-g参数
file 后ian加使用 -g编译的文件 可以不用推出, gdb 直接读取后进行调试
4、makefile 项目管理
1个规则
基本原则: 1、若想生成目标,检查规则中的依赖条件是否存在,若不存在,则寻找是否有规则用来生成该以来文件
2、检查规则中的目标是否需要更新,必须见检查它的所有依赖,以来中有任意一个被更新,则目标必须更新
目标:依赖条件
(一个tab缩进)命令
1、目标的时间必须晚于依赖条件的时间,否则,更新目录
2、依赖条件如果不存在,找寻新的规则区产生依赖
ALL: 指定项目中的中级目标
2个函数
src=$(wildcard ./*.c)
#匹配当前工作目录下的所有.c 文件,将文件名组成列表,复制给变量 src 。--> src=add.o sub.o div1.o
obj=$(patsubst %.c, %.o, $(src))
#将参数3中,包含参数1的部分,替换为参数2。obj=add.o sub.o div1.o
#其中"%"就是一个匹配字符,匹配时不能带有路径
clean: (没有依赖)
-rm -rf $(obj) a.out #其中 "-" 的作用是,删除不存在文件时,不报错,顺序执行结束
3个自动变量:
自动变量 | 功能 |
---|---|
$@ | 在规则的命令中,表示规则中的目标 |
$< | 在规则的命令中,表示规则中的第一个依赖条件。如果第一个依赖条件,如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则 |
$^ | 在规则的命令中,表示规则中的所有依赖条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项. |
模式规则–易拓展
%.o:%.c
gcc-c $< -o $@
静态模式规则
$(obj): %.o:%.c
gcc -c &< -o $@
伪目标
.PHONY: clean ALL
make的参数
参数 | 功能 |
---|---|
-n | 模拟执行 make 、 make clean 命令 |
-f | 指定文件执行 make 命令 *.mk |
提示: