shell常实用命令

文章目录

        • ubuntu ctrl + Alt +F(1~6)会进入终端模式, ctrl + Alt +F7退出终端模式
        • 环境变量设置
      • 脚本类
        • ssh
      • 查看端口占用信息
      • 服务/进程管理
      • linux进程信息
      • 软件包管理
        • opencv版本号查看
        • dpkg
        • apt
        • 查看linux安装的镜像
        • update-alternatives安装包版本切换
        • 关键安装问题解决
      • 文件类
        • grep
        • 取消patch
        • 带单位显示文件大小
        • 删除除指定文件(file1)以外文件
        • unzip 解压中文乱码的问题:
        • 挂载与卸载mount与umount:
        • du&df查看文件夹大小
        • find
        • 修改文件权限及拥有者
        • 修改可执行文件的执行权限
        • cp
        • mkdir
        • 目录之间的切换cd\pushd\popd
        • lsof查看文件占用情况
        • wc统计输出行数
        • head & tail
        • readelf查看二进制文件信息
        • patchelf 更改二进制文件
        • 查看共享库so依赖
        • 分卷压缩及解压
        • sed 指定文本内容替换
        • md5sum校验文件
      • 用户操作
      • 后台命令
        • jobs
        • linux后台执行命令
        • bash终端log重定向
      • Vim
        • ctags c/c++代码调用关系查看
      • 调试类
      • repo
      • git

ubuntu ctrl + Alt +F(1~6)会进入终端模式, ctrl + Alt +F7退出终端模式

环境变量设置

添加可执行文件路径到环境变量
export PATH=$PATH:/要添加的路径

添加共享库路径到环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_lib_path
也可以在 /etc/ld.so.conf 文件中添加库的搜索路径,然后执行ldconfig
ldconfig 可以加载该ld_lib_path路径到库链接路径,即执行该命令后,ld_lib_path路径下得库文件可以被找到并链接。

脚本类

执行命令时自动输入‘y’
echo y | cmd

ssh

利用ssh远程执行服务器命令

fuction expect_server()
{
	expect <

来判断$arg有没有被赋值,条件成立则没有被赋值。**

shell if[X$arg = X];then

打开ssh服务:
问题:ssh: connect to host xxx port 22: Connection refused解决

问题原因可能是:ssh-server未安装或者未启动。
ubuntu 11.10 默认安装openssh-client,但是木有安装server。

运行 ps -e | grep ssh,查看是否有sshd进程。
如果没有,说明server没启动,通过 service sshd start (或 /etc/init.d/ssh -start)启动server进程,如果提示ssh不存在 那么就是没安装server。
通过 sudo apt-get install openssh-server命令安装即可。

查看端口占用信息

netstat -tnlp 查看端口号的占用信息,可以打印出占用程序及程序ID
ps -ejHf | grep 441 查看进程执行信息

查看ssh端口开放状态
netstat -anp |grep 22
netstat -anp |grep ssh
lsof -i :22

服务/进程管理

kill命令不止用来结束进程,也可以给指定进程发送对应的信号
kill -l 可查看系统的信号的缩写及对应号,如11) SIGSEGV
ps未显示进程被报仍在运行进程,可能是/var/run下还有对应的xxx.pid文件,删除即可

linux进程信息

/var/run下存放xxx.pid是关于进程的pid信息
/var/log下存放xxx.log是关于进程的log信息

service & systemctl
service命令其实是去/etc/init.d目录下,去执行相关程序
usage:
service --status-all列出管理应用
service name option
option: [start\stop\restart]
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl
usage:
systemctl options name.service
option: [start\stop\restart\status]

软件包管理

opencv版本号查看

pkg-config opencv --modversion

dpkg

dpkg -i packagename安装软件包
dpkg -r packagename移除软件包
dpkg -S packagename查看插件属于哪个软件包
dpkg -l packagename 查看软件包信息

apt

查看已安装得软件包版本,也可使用dpkg -l packagename
sudo apt-get install apt-show-versions
apt-show-versions 查看所有安装包版本
apt-show-versions –p 查看指定安装包的版本
apt-show-versions –u 查看可更新包

apt-cache madison pacname查询仓库中软件的所有版本
apt-cache show pacname | grep -i version 查看版本信息
apt-get -y install pacname 免去回答yes安装pacname
apt-get -y install pacname=version 安装指定版本
apt-get install -s pacname 模拟安装软件

apt-cache search packagename 搜索软件包

apt install packagename 安装软件包
apt install --reinstall packagename 重新安装软件包

apt remove packagename 卸载软件包
apt list pacname 列出软件清单
apt show pacname 显示软件包信息
apt search pacname 搜索相关软件包

apt list|gerp pacname 查看pacname相关的安装情况

apt autoremove 卸载所有自动安装且不再使用的软件包
apt purge pacname 卸载并清除软件包的配置

查看linux安装的镜像

dpkg --get-selections |grep linux-image

update-alternatives安装包版本切换

update-alternatives命令的几个主要选项为:display、install、remove、config、list。

以python为例:
安装多版本python

#查看python文件位置
whereis python

sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /home/lxp3/anaconda36/bin/python python /home/lxp3/anaconda36/bin/python3.6 2
sudo update-alternatives --install /home/lxp3/anaconda3/bin/python python /home/lxp3/anaconda3/bin/python3.5 3
#查看当前python安装表:
update-alternatives --list python
#切换当前python:
sudo update-alternatives --config python

删除指定包:
sudo update-alternatives --remove python /usr/bin/python2.7 1

关键安装问题解决

/var/lib/dpkg下的文件存放所有安装包信息,info下存放包的校验值等,status存放安装信息,请不要暴力删除,会出现整体安装的刷新及重新配置

Q1:files list file for package ‘xxx’ missing; assuming package has no files currently installed
R1:sudo apt install --reinstall pcname, 根据情况添加-f,–fix-missing。
Q2:以上重装不行,报trying to overwrite ‘xxx’, which is also in package xxx
R2:
sudo dpkg-i --force-overwrite /var/cache/apt/archives/sysvinit_2.88dsf-41+deb7u1_amd64.deb #手动在缓存里面安装 sysvinit_2.88dsf-41+deb7u1_amd64.deb
sudo apt full-upgrade

文件类

nautilus
nautilus是GNOME桌面下的一个文件管理工具。 通过这个命令我们可以在终端下非常方便的打开指定目录的文件。

grep

grep字符搜索
grep ‘^…$’ 是指, 匹配整个这个行中, 以什么开头, 以什么结尾. 指的是整行, 不是某个单词.
grep -w (word) 指的是匹配整个单词, 而不能是单词的一部分
grep -rn “xxx” --exclude-dir=dirname,在dirname之外的目录查找

取消patch

patch -R 是反打patch,就是将打完patch的文件恢复到打patch之前。

带单位显示文件大小

ls -lh 以K、M、G显示文件大小

删除除指定文件(file1)以外文件

rm -fr !(file1)

unzip 解压中文乱码的问题:

#指定GBK GB18030编码也是可以的
unzip -O GBK 资料.zip

挂载与卸载mount与umount:

mount -rw /dev/xxx path :将/dev/xxx 挂载到path下
umount path :卸载path对应的设备
举例:将U盘挂载到/mnt/tmp下

  1. sudo fdisk -l: 查看分区情况,找到U盘对应的设备名(对应大小和文件系统FAT32),这里为/dev/sda1
  2. sudo mount -rw /dev/sda1 /mnt/tmp 挂载
  3. 可再/mnt/tmp下查看U盘内容

Linux系统挂载存储只读改成读写

  1. 用于查看哪个模块输入只读,一般显示为:
    [root@ubuntu ~]# mount

/dev/cciss/c0d0p2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
tmpfs on /dev/shm type tmpfs (rw)
/dev/dm-0 on /home/book/upload/BookFile1 type ext3 (rw)
/dev/dm-1 on /home/book/upload/BookFile2 type ext3 (rw)
/dev/dm-2 on /backup type ext3 (rw)
/dev/dm-3 on /home/book/upload/BookFile3 type ext3 (ro)

  1. ro是只读,rw是可读写
  2. umount /dev/dm-3
    如果发现有提示“device is busy”,找到是什么进程使得他busy
    fuser -m /mnt/data 将会显示使用这个模块的pid
    fuser -mk /mnt/data 将会直接kill那个pid
    然后重新mount即可。
  3. 还有一种方法是直接remount,命令为mount -o rw,remount /mnt/data。
    注意’,'号。
    可读写文件系统修改为只读的,方法类似,只不过mount时候的rw改为ro就好了。

du&df查看文件夹大小

df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。

du可以查看文件及文件夹的大小。

du
max-depth参数表示指定深入目录的层数,很重要,不指定的话,会显示所有层次目录

du -h --max-depth=1 /usr   
1.8G    /usr/share   
614M    /usr/lib   
8.0K    /usr/etc   
2.1M    /usr/kerberos   
24K     /usr/X11R6   
14G     /usr/local   
37M     /usr/libexec   
35M     /usr/sbin   
224M    /usr/include   
    [root@localhost /]# du -h --max-depth=1 /usr   

rsync
https://blog.csdn.net/jiangyu1013/article/details/79754060
rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

Local:  rsync [OPTION...] SRC... [DEST]
 
Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
 
Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

由此语法可知,rsync有三种工作方式:
(1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
(2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
(3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。
前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。
(1).将/etc/fstab拷贝到/tmp目录下。

[root@xuexi ~]# rsync /etc/fstab /tmp

(2).将/etc/cron.d目录拷贝到/tmp下。

[root@xuexi ~]# rsync -r /etc/cron.d /tmp

"–existing"选项使得只更新目标端已存在的文件。
"–remove-source-files"删除源端文件。
"–exclude"选项指定排除规则,排除那些不需要传输的文件。
“–delete"选项后,接收端的rsync会先删除目标目录下已经存在,但源端目录不存在的文件。也就是"多则删之,少则补之”。

find

find -name [filename],根据文件名查找文件
which [exec_tool],查看命令工具(python)使用的绝对路径
locate [filename],等同于find -name [filename],直接搜寻数据库,速度更快。

find忽略查找路径
find -path "./mnt" -prune -o -name "*eigin*"
""可以不加, -o不能省略

find -path pathname -prune 用来指定忽略查找路径。

如果要忽略两个以上的路径如何处理?

find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune …加上寻找条件
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -name filename
find /findpath /( -path “ignorepath1” -o -path “ignorepath2” /) -prune -o -type f -name “*.conf” -print
注意/( 和/) 前后都有空格。

查找文件并删除
find / -name "*.mp3" |xargs rm -rf

修改文件权限及拥有者

修改文件夹及子文件拥有者及用户组
chown -Rh owner:owner dir 修改拥有者及组
chown -Rh owner dir
chgrp -Rh group dir
-R 递进操作(recursive),使操作生效于子目录及文件。
-h 使操作生效于链接文件。

修改可执行文件的执行权限

chmod命令+s参数解释如下:

“为了方便普通用户执行一些特权命zd令,SUID/SGID程序回允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。”
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
原来只有某用户可以执行httpd这条命令, u+s后其他用户都可以使用httpd这个命令,都可享有指定+s的文件属主的权限。
chmod u+s file 就是给file程序的所有者以suid权限,答可以像root用户一样操作。

cp

拷贝目录使用 -r

(星号* 配合 -r)
cp -r /tmp/src/* /tmp/dest 星号(*)对隐藏文件无效

需要隐藏文件时:(点号.配合-r)
cp -r /tmp/src/. /tmp/dest

cp的时候有重复的文件需要覆盖时会让不停的输入yes来确认,可以使用yes|
yes|cp -r /x y

想使用CP拷贝一个大目录(/home/study/test),但又不想拷贝其中的一个子目录(/home/study/test/test1),应该如何写命令行
cd /home/study/test
rsync -av --exclude test1/ --exlclude test2/ ../test/ /home/copydir

mkdir

mkdir -p t/t1/t2
-p 会创建路径中的所有尚不存在的目录。若所有目录都存在,不报错,不创建。

目录之间的切换cd\pushd\popd

需要在两个或多个不同目录频繁切换:
cd -可以直接返回上一个目录
pushd 后加:在目录栈中指定目录,并切换到下:
pushd \
pushd 单独使用,能够调换栈顶目录和下一目录:
pushd

pushd使用介绍:push +2 返回栈顶下两层的目录;用于3个目录相互跳转;当前目录永远是栈顶目录。
pushd [-n] [+N | -N | 目录]

popd 将当前目录推出目录栈:
popd
演示:
shell常实用命令_第1张图片

lsof查看文件占用情况

经常会遇到删除文件或者弹出U盘等设备时,提示设备占用,使用lsof可查看文件或设备(linux系统中设备即文件)占用情况(程序名,pid等信息)。
lsof [opts] [filename]

wc统计输出行数

ls -l |wc

head & tail

head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录。
使用-n可指定显示几行。
head -25 显示25行。

readelf查看二进制文件信息

readelf可以查看二进制文件
readelf -h filename 查看二进制文件头,包括适用的系统版本及平台
readelf -d xxx.so 查看so共享库的依赖信息。
shell常实用命令_第2张图片

patchelf 更改二进制文件

更改依赖:
patchelf --replace-needed libm.so.6 libm.so libcholmod.so 将libcholmod.so对 libm.so.6的依赖变为lib.so
更改soname:
patchelf --set-soname libnewname.so path/to/libmylibrary.so
参考:修改so库中的依赖名

查看共享库so依赖

  1. 使用ldd查看
    ldd libindemind_module.so
  2. 使用readelf 查看
    readelf -d xxx.so

分卷压缩及解压

https://blog.csdn.net/baggio1006/article/details/17503113
分卷压缩:

tar cvzf - name | split -b 500m -d - name.tar.gz #分卷压缩name目录,并保持每个压缩包的大小不超过500m字节。命令执行后,会生成name.tar.gz00、name.tar.gz01等文件,注意此处name及name.tar.gz中的name要保持一致。

-表示默认处理。
关于split:
split -n 2 name.tar.gz name1.tar.gz可以将name.tar.gz拆分成两个name1.tar.gz00及name1.tar.gz01,但是此命令不能用于还为生成的文件(不能使用管道tar cvzf - name | split -n 2 -d - name.tar.gz不能执行)。

分卷解压:
cat name.tar.gz* | tar -zxvf - #将各个分卷压缩包解压到当前目录
cat name.tar.gz* > name.tar.gz #将各个分卷压缩包合成为一个name.tar.gz文件

sed 指定文本内容替换

sed -i 's/ori_str/new_str/' file 将file中每行第一个ori_str替换 为 new_str
sed -i 's/ori_str/new_str/'g file 将file中所有第一个ori_str替换 为 new_str

md5sum校验文件

md5sum filename可读取filename生成哈希值。
校验两个文本是否一致,可以对比哈希值是否一致。

用户操作

切换root用户
sudo su 和 sudo -s都是切换到root用户,不同的是:
sudo su 环境用的是目标用户(root)的环境
sudo -s 环境用的是当前用户本身的环境

创建新用户并添加root权限
sudo adduser username
注意区分adduser与useradd
添加用户root权限

  1. 修改配置文件
    vim /etc/sudoers
    修改文件如下:

# User privilege specification
root ALL=(ALL) ALL
username ALL=(ALL) AL

  1. 将用户添加到sudo组
    usermod -a -G sudo suveng //注意改成你自己的用户名
    列出所有用户
    cat /etc/passwd |cut -f 1 -d :
    注意:useradd adduser 都能用,useradd没有在home下生成用户对应的目录。adduser可以用来将用户添加到指定组。
    添加用户:useradd -m 用户名 然后设置密码 passwd 用户名
    删除用户:userdel -r 用户名

** adduser与useradd区别**
useradd:
“useradd +用户名” 不会在/home目录下创建同名文件夹,也没有创建密码;因此不能使用该用户登录。
使用 “useradd -m +用户名” 方式创建,可在/home目录下创建同名文件夹,然后利用 " passwd + 用户名" 为指定的用户名设置密码。
adduser:
“adduser +用户名” 直接在/home目录下会自动创建同名文件夹。

删除用户,只需使用一个简单的命令“userdel 用户名”即可。不过最好将它留在系统上的文件也删除掉,你可以使用“userdel -r 用户名”来实现这一目的。

sudo 免密用于脚本需使用sudo
https://blog.csdn.net/u011596455/article/details/76944065
sudo visudo
修改这一样,让所有sudo指令免密

xxx ALL=(ALL:ALL) NOPASSWD: ALL

[解决:Jenkins sudo:抱歉,您必须拥有一个终端来执行 sudo]
https://blog.csdn.net/fst438060684/article/details/80984233
那么第一个思路就是免密使用sudo了,假设我使用jenkins的账户是xdq,那么我用root账户 修改/etc/sudoers(或sudo visudo)的配置,添加如下两项:
xdq ALL=(ALL) NOPASSWD: ALL
Defalults:xdq requiretty

后台命令

将任务放至后台运行
命令后加&
$ ./test.sh &

将已执行程序暂停/运行在后台
ctrl+z快捷键可直接将当前程序暂停在后台。
vi t.txt
ctrl+z后将vi暂停在后台,终端输入fg命令可直接重新调起。

jobs

jobs命令可以查看后台任务运行情况;
jobs -l 命令可显示执行任务的pid;
使用 fg 任务序号 可直接重新调起对应的后台任务;
使用bg 任务序号 可将后台暂停程序在后台运行。

linux后台执行命令

command > out.file 2>&1 &

command > out.file &
将command输出重定向到out.file中   将错误信息输出到屏幕   &符号可将命令放于后台执行
使用nohup使进程执行时不被hup信号中断(在服务器上运行模型时用,放置ssh断开连接后,程序被退出)。
nohup command >out.file 2>&1 &

bash终端log重定向

输出到文件logfile中,log信息不在屏幕显示
cmd > logfile
输出到文件logfile中,并在屏幕上显示:
cmd | tee logfile
cmd >&1 | tee logfile 将cmd的输出到终端,且将终端输出打印到log文件
追加输出到文件logfile中,并在屏幕上显示:
cmd >&1 | tee -a logfile
>后边加&表示后边跟的文件描述符,不是文件名,如>&1 重定向到标准输出(屏幕)
将命令正确执行和错误的输出结果都保存到文件log.log:
cmd 2>&1 | tee log.log -a

tee命令用于读取标准输入的数据,并将其内容输出成文件。

将终端的输出信息保存到log中:
sudo script screen.log
之后你在终端输入的相关命令,及终端的所有输出信息都被保存到screen.log文件中,然后执行以下命令,停止保存:
exit

Vim

在命令界面(esc不能编辑文本),在当前行任意位置,摁o键直接进入编辑页面并回车。

命令
:set nu 显示行号
:set hlsearch 高亮显示搜索结果

:vs xxx 竖栏显示xxx文件
ctrl+w x 交换左右栏显示,先同时嗯ctrl及w,然后放手,再摁下x,下同
:sp xxx 横栏显示xxx文件
使用ctrl+w 上下左右键切换文件栏目

:f 可以显示当前文件名
:!pwd 可以看当前的详细路径,这个用ctrl+z也可以将vi放后台查看。
:Ex 横排打开栏,当前文件所在的目录
:Ve 竖排打开栏,当前文件所在的目录

:se list 显示文件的空格。
dw 删除一个word
D 删除光标所在到行结束。

可用Esc-v-上下左右键选中字符
gu 转换选中为小写
gU 转换选中为大写
也可以Esc-gu/U-上下键会将选中变为小/大写

关于使用vi替换字符串:
:s/str1/str2/ 替换当前行第一个 str1 为 str2
:s/str1/str2/g 替换当前行所有 str1 为 str2
:n,\$s/str1/str2/ 替换第 n 行开始到最后一行中每一行的第一个 str1 为 str2
:n,$s/str1/str2/g 替换第 n 行开始到最后一行中每一行所有 str1 为 str2
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/str1/str2/(等同于 :g/str1/s//str2/) 替换每一行的第一个 str1 为 str2
:%s/str1/str2/g(等同于 :g/str1/s//str2/g) 替换每一行中所有 str1 为 str2
2. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#str1/#str2/# 替换当前行第一个 str1/ 为 str2/

:%s+/str1/str10/+/str2/str20+(使用+ 来 替换 / ): /str1/str10/替换成/str2/str20/

定位括号
"{"上按%,即可定位到对应的 “}”

ctags c/c++代码调用关系查看

#生成代码tag信息,用来追踪调用关系,-R表示文件夹下的代码进行递归创建
ctags –R
#变量名定义查找,直接用vi打开tagname定义代码处
vi –t tagname (请把tag替换为您欲查找的变量或函数名)

#####################以下是在vi中的tag相关使用,“:”开头的命令为VI中命令行模式命令
:ts(ts助记字:tagslist)
:tp(tp助记字:tagspreview)
:tn(tn助记字:tagsnext)
#直接跳到光标所在函数或参数的默认定义处
Ctrl+ ]:注意是按一下ctrl,再按]
#显示tag(光标所在函数/参数)所有定义的列表
g + ] :注意是按一下g,再按]
#跳转返回到上一个定义处查找,即Ctrl+ ]的反跳转
Ctrl+ T

解决关于ctags只能追踪本层目录下的代码

解决办法是在在vim的配置文件 ~/vimrc 添加如下内容:

set tags=tags
set autochdir

使如果源文件在当前文件夹下没有找到tags,可以到它的上层目录下继续寻找。
ctags使用参考

要使用更多tags文件,可以通过改变’tags’选项的设置来引入更多的tags文件。如:
vim下,(ex command) :set tags=./tags, ./…/tags, ./*/tags

调试类

python有调试器pdg,即python debug

adb 安卓调试
查看系统服务相关信息
adb shell dumpsys -l
adb shell service list
adb shell dumpsys media.camera |head 查看摄像头设备信息

usb转串口使用

  1. 接线方式:GND 对 GND,TX 对 RX,RX 对 TX

minicom使用
安装:
sudo apt install minicom

使用:
sudo minicom

打开波特率端口配置界面
sudo minicom -s
配置好后保存退到首界面,便可以看到log信息。

默认的usb串口节点是/dev/ttyUSB0

repo

repo stage 用于添加文件到暂存区
使用方法
repo stage -i可以一步步与用户交替选择要添加到暂存区的文件。–interactive 交互式
repo sync -c只下载当前分支的代码.

git

只下拉最新代码包,下拉速度快
git clone git仓库地址 --depth=1

清理修改或新增的文件:
如果没有add,则:
还原修改的文件:
git checkout .
单个文件/文件夹:
$ rm filename / rm dir -rf
所有文件/文件夹:
$ git clean -xdf
删除更改:
git clean -df
maven用来解决依赖关系的,通过pom.xml 来表明以来关系。

你可能感兴趣的:(shell)