• Linux系统常用命令以及常见问题的解决方法


    常用命令

    • sed

    sed 是一种流编辑器,它是文本处理中非常常用的工具,能够完美的配合正则表达式使用,功能非常强大。

    mkdir playground
    
    touch test.txt
    
    echo "Hello world!" >> test.txt
    
    cat>test.txt<<EOF
    
    > i love you
    
    > my honey
    
    > be easy
    
    > last row
    
    > EOF

    例如:

    (1) 删除文档的第一行

    sed -i '1d' test.txt
    
    cat test.txt
    my honey
    be easy
    last row
    test.txt

    (2) 删除文档的第三行

    sed -i '3d' test.txt
    
    cat test.txt
    my honey
    be easy
    test.txt

    (3) 删除文档的最后一行

    sed -i '$d' test.txt
    
    cat test.txt
    my honey
    test.txt
    • dpkg

    dpkgDebian package的简写,是为Debian操作系统专门开发的套件管理系统,用于软件的安装、更新和移除。所有源自 Debian 的 Linux 发行版都使用dpkg,最常见的如 Ubuntu

    (1) 软件安装

    cv@cv: ~$ sudo dpkg -i file.deb

    其中file.deb是提前手动下载下来的安装包。

    有时候安装某个软件时会需要环境中其他依赖项的配置,使用 -f 命令让系统自动去处理依赖项问题。

    cv@cv: ~$ sudo apt-get install -f

    (2) 软件卸载

    cv@cv: ~$ sudo dpkg -l | grep chrome

    卸载之前一般先查看软件版本等的信息,-l命令用于显示包的版本

    cv@cv: ~$ sudo dpkg -r file.deb

    移除软件,但保留配置,如果想要不保留配置,使用-P命令

    cv@cv: ~$ sudo dpkg -P file.deb
    • uname

    该命令用来查看操作系统的详细信息。用法如下

    uname [OPTION]...

    当没有给定参数时,默认输出 uname -s 的结果,只显示内核名称。

    参数解释如下:

    -a  按下面参数出现的顺序输出所有信息,如果处理器和硬件平台信息未知则略去-p和-i的结果
    -s  输出内核名称
    -n  输出网络主机的名称
    -r  输出当前系统的内核发行版本
    -v  输出内核版本信息
    -m  输出机器硬件名称
    -p  输出处理器型号
    -i  输出硬件平台的信息
    -o  输出操作系统的信息
    --help  展示帮助信息并退出
    cv@cv: ~$ uname -a
    Linux    # kernel-name
    cv        # nodename
    4.15.0-48-generic    # kernel-release
    #51~16.04.1-Ubuntu SMP Fri Apr 5 12:01:12 UTC 2019    # kernel-version
    x86_64    # machine
    x86_64    # processor
    x86_64    # hardware-platform
    GNU/Linux    # operating-system
    • tree

    用来显示指定文件夹的目录结构,以便我们迅速了解该文件夹下由那些文件/文件夹构成。

    (1) 不加任何参数时,默认显示当前文件夹的所有文件及其结构

    cv@cv: ~$ tree
    .
    ├── build
    │   ├── block.png
    │   ├── chessboard.png
    │   ├── CMakeCache.txt
    │   ├── CMakeFiles
    │   │   ├── 3.5.1
    │   │   │   ├── CMakeCCompiler.cmake
    │   │   │   ├── CMakeCXXCompiler.cmake
    │   │   │   ├── CMakeDetermineCompilerABI_C.bin
    │   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
    │   │   │   ├── CMakeSystem.cmake
    │   │   │   ├── CompilerIdC
    │   │   │   │   ├── a.out
    │   │   │   │   └── CMakeCCompilerId.c
    │   │   │   └── CompilerIdCXX
    │   │   │   ├── a.out
    │   │   │   └── CMakeCXXCompilerId.cpp
    │   │   ├── cmake.check_cache
    │   │   ├── CMakeDirectoryInformation.cmake
    │   │   ├── CMakeOutput.log
    │   │   ├── CMakeTmp
    │   │   ├── feature_tests.bin
    │   │   ├── feature_tests.c
    │   │   ├── feature_tests.cxx
    │   │   ├── Makefile2
    │   │   ├── Makefile.cmake
    │   │   ├── progress.marks
    │   │   ├── raytrace.dir
    │   │   │   ├── build.make
    │   │   │   ├── cmake_clean.cmake
    │   │   │   ├── CXX.includecache
    │   │   │   ├── DependInfo.cmake
    │   │   │   ├── depend.internal
    │   │   │   ├── depend.make
    │   │   │   ├── flags.make
    │   │   │   ├── link.txt
    │   │   │   ├── lodepng
    │   │   │   │   └── lodepng.cpp.o
    │   │   │   ├── progress.make
    │   │   │   └── raytrace
    │   │   │   ├── algebra.cpp.o
    │   │   │   ├── binary.cpp.o
    │   │   │   ├── chessboard.cpp.o
    │   │   │   ├── cuboid.cpp.o
    │   │   │   ├── cylinder.cpp.o
    │   │   │   ├── debug.cpp.o
    │   │   │   ├── dodecahedron.cpp.o
    │   │   │   ├── icosahedron.cpp.o
    │   │   │   ├── main.cpp.o
    │   │   │   ├── optics.cpp.o
    │   │   │   ├── planet.cpp.o
    │   │   │   ├── reorient.cpp.o
    │   │   │   ├── scene.cpp.o
    │   │   │   ├── setcompl.cpp.o
    │   │   │   ├── setisect.cpp.o
    
    │   │   │   ├── setunion.cpp.o [0/742]
    │   │   │   ├── solid.cpp.o
    │   │   │   ├── sphere.cpp.o
    │   │   │   ├── spheroid.cpp.o
    │   │   │   ├── thinring.cpp.o
    │   │   │   ├── torus.cpp.o
    │   │   │   └── triangle.cpp.o
    │   │   └── TargetDirectories.txt
    │   ├── cmake_install.cmake
    │   ├── cuboid.png
    │   ├── cylinder.png
    │   ├── difference.png
    │   ├── donutbite.png
    │   ├── intersection.png
    │   ├── Makefile
    │   ├── multisphere.png
    │   ├── overlap.png
    │   ├── polyhedra.png
    │   ├── raytrace
    │   ├── saturn.png
    │   ├── sphere.png
    │   ├── spheroid.png
    │   ├── torus1.png
    │   └── torus2.png
    ├── CMakeLists.txt
    ├── lodepng
    │   ├── lodepng.cpp
    │   └── lodepng.h
    └── raytrace
    ├── algebra.cpp
    ├── algebra.h
    ├── binary.cpp
    ├── block.h
    ├── chessboard.cpp
    ├── chessboard.h
    ├── cuboid.cpp
    ├── cylinder.cpp
    ├── debug.cpp
    ├── dodecahedron.cpp
    ├── icosahedron.cpp
    ├── imager.h
    ├── main.cpp
    ├── optics.cpp
    ├── planet.cpp
    ├── planet.h
    ├── polyhedra.h
    ├── raytrace.vcproj
    ├── reorient.cpp
    ├── scene.cpp
    ├── setcompl.cpp
    ├── setisect.cpp
    ├── setunion.cpp
    ├── solid.cpp
    ├── sphere.cpp
    ├── spheroid.cpp
    ├── thinring.cpp
    ├── torus.cpp
    └── triangle.cpp
    
    11 directories, 102 files
    tree

    (2) 利用-L参数,显示到Level 2即停止,不会全部显示出来,方便我们宏观把握

    cv@cv: ~$ tree -L 2
    .
    
    ├── build
    │   ├── block.png
    │   ├── chessboard.png
    │   ├── CMakeCache.txt
    │   ├── CMakeFiles
    │   ├── cmake_install.cmake
    │   ├── cuboid.png
    │   ├── cylinder.png
    │   ├── difference.png
    │   ├── donutbite.png
    │   ├── intersection.png
    │   ├── Makefile
    │   ├── multisphere.png
    │   ├── overlap.png
    │   ├── polyhedra.png
    │   ├── raytrace
    │   ├── saturn.png
    │   ├── sphere.png
    │   ├── spheroid.png
    │   ├── torus1.png
    │   └── torus2.png
    ├── CMakeLists.txt
    ├── lodepng
    │   ├── lodepng.cpp
    │   └── lodepng.h
    └── raytrace
    ├── algebra.cpp
    ├── algebra.h
    ├── binary.cpp
    ├── block.h
    ├── chessboard.cpp
    ├── chessboard.h
    ├── cuboid.cpp
    ├── cylinder.cpp
    ├── debug.cpp
    ├── dodecahedron.cpp
    ├── icosahedron.cpp
    ├── imager.h
    ├── main.cpp
    ├── optics.cpp
    ├── planet.cpp
    ├── planet.h
    ├── polyhedra.h
    ├── raytrace.vcproj
    ├── reorient.cpp
    ├── scene.cpp
    ├── setcompl.cpp
    ├── setisect.cpp
    ├── setunion.cpp
    ├── solid.cpp
    ├── sphere.cpp
    ├── spheroid.cpp
    ├── thinring.cpp
    ├── torus.cpp
    └── triangle.cpp
    
    4 directories, 51 files
    tree -L 2

    (3) 利用-I参数指定忽略某个文件夹,因为有时候我们明确知道不需要显示该文件包含的文件和结构

    cv@cv: ~$ tree -I build
    .
    ├── CMakeLists.txt
    ├── lodepng
    │   ├── lodepng.cpp
    │   └── lodepng.h
    └── raytrace
    ├── algebra.cpp
    ├── algebra.h
    ├── binary.cpp
    ├── block.h
    ├── chessboard.cpp
    ├── chessboard.h
    ├── cuboid.cpp
    ├── cylinder.cpp
    ├── debug.cpp
    ├── dodecahedron.cpp
    ├── icosahedron.cpp
    ├── imager.h
    ├── main.cpp
    ├── optics.cpp
    ├── planet.cpp
    ├── planet.h
    ├── polyhedra.h
    ├── raytrace.vcproj
    ├── reorient.cpp
    ├── scene.cpp
    ├── setcompl.cpp
    ├── setisect.cpp
    ├── setunion.cpp
    ├── solid.cpp
    ├── sphere.cpp
    ├── spheroid.cpp
    ├── thinring.cpp
    ├── torus.cpp
    └── triangle.cpp
    
    2 directories, 32 files
    tree -I build

    如果需要忽略多个文件夹,多个文件夹之间使用分隔符 "|" 隔离开,并将要忽略的文件名字符串用单引号引起来,如下所示

    cv@cv: ~$ tree -I 'build|cmake_build_debug'

    ===================================================分割线===================================================

    常见问题及解决方案

    • SWAP分区的手动刷新

    SWAP 分区是 Linux 系统的交换分区,一般在安装系统时建立。

    Memory指机器物理内存,读写速度比 CPU 低一个量级,但比磁盘高了不止一个量级。因此程序和数据如果在内存中的话,会有非常快的读写速度。但内存造价高于磁盘,且内存在断电时会丢失数据也是不能把所有数据和程序都保存在内存中的原因。既然不能全部使用内存,那数据还有程序不可能一直霸占内存。当内存空间不足时,就必须要把内存中不经常运行的程序踢出去。

    SWAP 全称swap place,即交换分区。当内存不够时,被踢出的进程被暂时存储到交换区,以便让系统不会因内存不够而导致oom或者其他更致命的情况。当需要这条被踢出的进程时,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。

    根据Centos官网介绍,SWAP的大小可以按如下公式确定

    M = Amount of RAM in GB, and S = Amount of swap in GB, then If M < 2, S = M * 2 Else S = M + 2

    但有时服务器访问量确实很大,有可能出现 SWAP 分区不够用的情况,需要手动构建,这是后话。

    在 Linux上可使用 swapon -s 命令查看当前系统上正在使用的交换空间有哪些,以及相关信息。

    cv@cv: ~$ swapon -s
    Filename                                Type            Size    Used    Priority
    /dev/sdb8                               partition       3905532 0       -2

    当 SWAP占用率较高时,对系统性能可能会有一定的影响,所以在适当情况下,我们需要手动刷新,将 SWAP里的数据转储回内存,并清空SWAP里的数据。

    其原理非常简单,就是把 SWAP 关闭再重启。

    cv@cv: ~$ sudo swapoff -a && sudo swapon -a
    • sudo apt update的问题

    update时出现下面的提示

    E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
    E: Unable to lock directory /var/lib/apt/lists/

    解决方法

    方法1:找出所有占用 apt 的进程

    cv@cv: ~$ ps -A | grep apt

    终止这些占用进程

    cv@cv: ~$ sudo kill -9 processnumber

    之后再 update 即可。

    方法2:删除被锁定文件

    cv@cv: ~$ sudo rm /var/cache/apt/archives/lock
    cv@cv: ~$ sudo rm /var/lib/dpkg/lock

    强制重置配置软件包

    cv@cv: ~$ sudo dpkg --configure -a

    之后再 update 即可。

    • CLI运行脚本出现syntax error: unexpected end of file

    通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我这里用的是 Sublime text 。

    编辑完脚本上传到服务器运行时,会出现语法错误,以下面的一小段脚本为例

    #!/bin/bash
    echo "updatedb..."
    sudo updatedb
    
    BASE_PATH=$(dirname $(locate $0))
    echo ${BASE_PATH}
    
    if [ $BASE_PATH == "TODO" ]
    then
        echo "please modify this script with the base path of your bundler installation";
        exit;
    fi
    
    EXTRACT_FOCAL=${BASE_PATH}/bin/extract_focal.pl
    echo ${EXTRACT_FOCAL}
    
    echo "[- Done -]"
    cv@cv: ~/bundler$ bash runbundler.sh
    runbundler.sh: line 4: $'
    ': command not found
    runbundler.sh: line 7: $'
    ': command not found
    runbundler.sh: line 13: $'
    ': command not found
    runbundler.sh: line 16: $'
    ': command not found
    runbundler.sh: line 17: syntax error: unexpected end of file

    这里显示的两个问题都是因为我们的 .sh 文件为 dos 格式,在 dos/windows 系统中按一次回车键实际上输入的是 CRLF ,即回车+换行。

    而 Linux 系统一般只能执行 unix 格式的脚本,在 Linux/Unix 系统中按一次回车键实际上输入的是 LF ,即只有换行。

    所以这里在 Windows 系统编辑的 sh 脚本文件每行都多了一个回车,当在 Linux 系统中运行时就会报错提示找不到相关命令。

    我们可以查看该脚本的格式,在命令行使用 vim 打开脚本, ESC 进入命令输入模式,输入 :set ff ,查看输出结果,比如我得到的是 fileformat=dos 

    此时我们可以使用 :set ff=unix 将 dos 格式更改为 unix 格式, ff=fileformat ,因此也可以输入 :set fileformat=unix ,这是 :set ff 查看会得到修改后的结果 fileformat=unix 

    然后再执行脚本就不会出现上面的错误了!

    • 文本格式转换之 docx-to-pdf 

    利用 Liunx 下的 LibreOffice 来实现

    ~$ python
    
    >> import os
    
    >> os.system(“libreoffice --invisible --convert-to pdf --outdir /home/cv/Documents/myfiles/  /home/cv/Documents/myfiles/source.docx”)

    注意:

    1. 转换时要保证 libreoffice 没有被打开
    2. 通过命令行调用 liberoffer 时需要注意中文不显示、中文乱码等问题,具体参考博客https://blog.csdn.net/zapperstab/article/details/18602969

    未完待续……

    Reference

    [1] 解决执行脚本报syntax error: unexpected end of file或syntax error near unexpected token `fi'错误的问题

    [2] linux下docx转pdf

  • 相关阅读:
    linux卸载mysql,apache,php
    iOS 秒数转换成时间,时,分,秒
    iOS 正则表达式判断邮箱、身份证..是否正确
    ios 删除系统从相册压缩的视频
    iOS 视频选择压缩
    iOS 从相册中拿到 图片名 ,截取后缀,图片名
    ios 根据颜色生成图片,十六进制颜色。
    ios 友盟第三方登录遇到的各种坑。
    项目适配iOS9遇到的一些问题及解决办法 ,以及URL 白名单配置方法
    ios 设置head请求头,自定义head, read response header
  • 原文地址:https://www.cnblogs.com/phillee/p/10789243.html
Copyright © 2020-2023  润新知