10 minute read

本篇文章汇总了 Unix 和 Linux 学习的相关资源,包括 Unix 和 Linux 的历史渊源、相关工具等内容,适合 Unix 和 Linux 开发者参考。

General Knowledge

Linux Distributions

Softwares/Tools/Knowledge

Linux常用命令

# 先尝试man再尝试google
man xxx

sha1sum/md5sum

mtools # mtools 命令用于显示mtools 支持的指令。mtools 实际上是一个命令集合,是DOS 文件系统的工具程序,它可以模拟许多MS-DOS命令,使用起来非常方便。使用权限是所有用户。

# set the system's date from a remote host
# sudo apt-get install rdate
rdate

grep -R "org.apache.commons.FileUtils" *
grep -inr --color "ERROR" test_debug.log
netstat -tulnp | grep mysqld # 查看mysqld的监听情况
netstat –apn | grep pid   #先查进程号,再找到进程信息
netstat -lntp          # 查看所有监听端口
netstat -antp          # 查看所有已经建立的连接
netstat -anp | grep xxxx   #xxxx为端口号 Linux下查看某个端口下运行的是什么程序
netstat -s             # 查看网络统计信息进程
watch "ls -al myfile" 监控文件变化

cat /etc/issue # 查看当前操作系统发行版信息

nproc --all #查看核心数

apt-cache # query the APT cache
apt-file search libz.so.1 # APT package searching utility
apt-cdrom # apt-cdrom is a tool to add CDROM's to APT's source list.
dpkg

sudo sh *.sh # 打开.sh文件
./*** # 打开其它可执行文件,如果没有可执行权限,需要chmod

man nautilus
man ed

xdg-open # 命令行快速打开各类型文件
mplayer xxx.mp3 # 使用mplayer打开

fc-list :lang=zh-cn # 查看字体

uname -a               # 查看系统信息
head -n 1 /etc/issue   # 查看操作系统版本
hostname               # 查看计算机名,hostname name只能暂时修改,重启后失效,如果需要永久修改,使用/etc/hostname文件
lspci -tv              # 列出所有PCI设备。PCI和PCI Express,是计算机常使用的一种高速总线。操作系统中的PCI/PCI-E设备驱动以及操作系统内核,都需要访问PCI及PCI-E配置空间。PCI/PCI-E设备的正常运行,离不开PCI/PCI-E配置空间。通过读写PCI/PCI-E配置空间,可以更改设备运行参数,优化设备运行。本文介绍用户空间可以读取、修改、扫描PCI/PCIE设备的用户命令及使用。在Linux内核中,为PCI和PCI-E只适用了一种总线PCI(内核提供的总线系统),故访问PCI-E配置空间,也包括了PCI设备配置空间。
lsusb -tv              # 列出所有USB设备
lsmod                  # 列出加载的内核模块
env                    # 查看环境变量资源
df -h                  # 查看各分区使用情况
df -i                   # 查看inode使用
grep MemTotal /proc/meminfo   # 查看内存总量
grep MemFree /proc/meminfo    # 查看空闲内存量
uptime                 # 查看系统运行时间、用户数、负载
cat /proc/loadavg      # 查看系统负载磁盘和分区
mount | column -t      # 查看挂接的分区状态
fdisk -l               # 查看所有分区
cfdisk -Ps # 查看磁盘分区的用法   cfdisk   -Ps 磁盘设备名 只有一个硬盘也可以用 cfdisk -Ps
cfdisk -Ps /dev/sda
sfdisk -l
hdparm -i /dev/hda     # 查看磁盘参数(仅适用于IDE设备)
dmesg | grep IDE       # 查看启动时IDE设备检测状况网络
ifconfig               # 查看所有网络接口的属性
route -n               # 查看路由表
w                      # 查看活动用户
id <用户名>            # 查看指定用户信息
last                   # 查看用户登录日志
cut -d: -f1 /etc/passwd   # 查看系统所有用户
cut -d: -f1 /etc/group    # 查看系统所有组
crontab -l             # 查看当前用户的计划任务服务
rpm -qa                # 查看所有安装的软件包
rpm -q mysql   # 查看是否安装了mysql客户端

lsof -i :xxxx    #xxxx为端口号

# file 检测并显示文件类型
file /bin/bash

cat /proc/version # 查看内核版本命令
lsb_release -a ##查看linux版本
cat /etc/debian_version
cat /etc/issue
cat /etc/debian_version //Only for Debian
cat /etc/redhat-release //Only for Redhat
rpm -q redhat-release //Only for Redhat
redhat-release-5Server-5.6.0.3

# 注:这种方式下可看到一个所谓的release号,比如上边的例子是5,这个release号和实际的版本之间存在一定的对应关系,如下:
# redhat-release-3AS-1 -> Redhat Enterprise Linux AS 3
# redhat-release-3AS-7.4 -> Redhat Enterprise Linux AS 3 Update 4
# redhat-release-4AS-2 -> Redhat Enterprise Linux AS 4
# redhat-release-4AS-2.4 -> Redhat Enterprise Linux AS 4 Update 1
# redhat-release-4AS-3 -> Redhat Enterprise Linux AS 4 Update 2
# redhat-release-4AS-4.1 -> Redhat Enterprise Linux AS 4 Update 3
# redhat-release-4AS-5.5 -> Redhat Enterprise Linux AS 4 Update 4

# man update-alternatives

# Configure参数解释说明: autoconf: 16 Running configure Scripts

# 把/dev/cdrom目录制作为镜像,名字为/root/rh1.iso,可以使用下面命令中的任意一条
dd if=/dev/cdrom of=/root/rh1.iso
#cat /dev/cdrom >;/root/1.iso
mkisofs -r -o myiso.iso /dev/cdrom
cp -r /home/user name.iso

# man tailf
# Linux下分割合并文: man split/cat
# 生成目录树结构: man tree

# 重命名文件
rename

# 切换用户并执行一条命令
su - oracle -c command
# 切换用户并执行一个shell文件
su - oracle -s /bin/bash shell.sh

常见Linux工具

ls/eza

ls -t `find . -name "*.log"` #列出最近修改的文件
ls --full-timne myfile # 查看文件的完整时间信息

eza is a modern alternative for the venerable file-listing command-line program ls that ships with Unix and Linux operating systems, giving it more features and better defaults. It uses colours to distinguish file types and metadata. It knows about symlinks, extended attributes, and Git. And it’s small, fast, and just one single binary.

cd/zoxide/pushd/popd

pushd ~/Code/java
popd

top

top # 实时显示进程状态用户
top -U jiangxin11 #仅查看特定用户
# 使用E切换内存使用总和的单位(KB、MB、GB、TB、PB)
# 使用e切换每个应用占用内存的单位(KB、MB、GB、TB、PB)

ps

ps -u jiangxin11 # 查看某个用户的进程,使用$USER可以代替当前用户
ps -ef # -e 显示所有进程;-f 显示完整格式
ps -ef -w # -w 显示宽格式, -ww 显示更宽格式,防止被截断
ps -ef | grep 4736 # 查看4736端口是否被占用
ps -p <PID> -o comm,args # comm 显示进程名,args 显示完整的启动命令(含参数)
ps -p <PID> -o stat # 显示某个进程的状态
ps -aux

du

du -sh <目录名>        # 查看指定目录的大小
du --max-depth=1 dir   # 查看指定目录指定深度的大小
du -h --max-depth=1 dir   # 查看指定目录指定深度的大小,并且以人类可读的方式显示

find

find . –name "*.log" | xargs grep error # 在当前目录的所有日志文件中查找关键词"error"
find . -type f | wc -l #查询当前目录文件数目
find "/etc/" -name "*" -type f | xargs wc -l | awk '{print $2" "$1"lines"}' # 打印某一文件夹下的所有文件名及其行数
find -maxdepth 1 -name "make*.log" -not -name "make_2026-02-04_19-23-30.log" -exec mv {} ~/log_tmp/ \; # 逐个移动
find -maxdepth 1 -name "make*.log" -not -name "make_2026-02-04_19-23-30.log" -exec mv -t ~/log_tmp/ {} + # 批量移动
find -maxdepth 1 -name "make*.log" -not -name "make_2026-02-04_19-23-30.log" | xargs -I {} mv {} ~/log_tmp/ # 如果不适用-I,xargs 会把所有输入追加到命令末尾,变成mv ~/log_tmp/ ./xxx.log ./yyy.log ./zzz.log这样

fd

fd is a program to find entries in your filesystem. It is a simple, fast and user-friendly alternative to find.

tar

tar的相关参数 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

-z:有gzip属性的 -j:有bz2属性的 -Z:有compress属性的 -v:显示所有过程 -O:将文件解开到标准输出

*.gz 用 gzip -d或者gunzip 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 *.Z 用 uncompress 解压

下面的参数-f是必须的

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

tar -cf all.tar *.jpg # 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
tar -rf all.tar *.gif # 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -uf all.tar logo.gif # 这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。
tar -tf all.tar # 这条命令是列出all.tar包中所有文件,-t是列出文件的意思
tar -xf all.tar # 这条命令是解出all.tar包中所有文件,-x是解开的意思

tar –cvf jpg.tar *.jpg # 将目录里所有jpg文件打包成tar.jpg
tar –czf jpg.tar.gz *.jpg   # 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar -czf jpg.tgz *.jpg # 将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tgz
tar –cjf jpg.tar.bz2 *.jpg # 将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar –cZf jpg.tar.Z *.jpg   # 将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z

tar –xvf file.tar # 解压 tar包
tar -xzvf file.tar.gz # 解压tar.gz
tar -xjvf file.tar.bz2   # 解压 tar.bz2
tar –xZvf file.tar.Z   # 解压tar.Z

rar/unrar

rar a jpg.rar *.jpg # rar格式的压缩,需要先下载rar for linux
unrar e file.rar # 解压rar

zip/unzip

zip jpg.zip *.jpg # zip格式的压缩,需要先下载zip for linux
zip -ry dir.zip dir # 将目录dir下的所有文件打包成dir.zip,-r参数表示递归打包,-y参数表示保留符号链接
unzip file.zip # 解压zip

readelf

readelf 是一个显示ELF格式文件信息的工具,ELF是Executable and Linkable Format的缩写,是Linux系统下可执行文件、目标代码、共享库和核心转储的标准文件格式。

readelf -d xxx.so # 查看xxx.so的动态段信息
readelf -d xxx.so | grep NEEDED # 查看xxx.so依赖的库

addrline

# Android本地构建的时候会生成符号表
$ llvm-addr2line -e out/target/product/missi/symbols/system_ext/lib64/libmisurfaceflinger.so -f 0x5535c

ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8nn210000EOS5
prebuilts/clang/host/linux-x86/clang-r563880/include/c++/v1/string:1057

tmux

tmux 是一个终端复用器:它允许创建、访问和控制多个终端,所有这些都可以在单个屏幕上进行。tmux 可以从屏幕中分离出来,在后台继续运行,稍后可以重新连接。

screen

会话恢复,多窗口,会话共享,与tmux功能类似,兼容一些老系统,新系统上用tmux的比较多。

Byobu

Byobu 是一个功能强大的开源文本终端窗口管理器,它基于 tmux 或 GNU Screen 提供了一个增强的用户体验。

script

记录所有终端活动,包括输入和输出(所以记录的日志中包含很多特殊字符,不方便直接查看),可以通过scriptreplay工具进行回放。

tee

从标准输入中获取数据然后同时写到标准输出和文件。

xxx 2>&1 | tee xxx_$(date "+%Y-%m-%d_%H-%M-%S").log

sshfs

# 在linux下使用sshfs挂载另一台服务器的某个目录
sshfs ${USER}@${HOST}:${DIR} ./remote
sudo umount remote

挂载之后可以通过wsl进行访问,但是Powershell或者Windows资源管理器无法访问,报错:

\\wsl$\Ubuntu\home\jiangxin\remote 无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。

试图访问无效的地址。

这是因为默认情况下目录只允许挂载目录的用户访问,这里就是wsl用户本身。可以通过如下方式解决:

  1. 修改/etc/fuse.conf,将user_allow_other取消注释
  2. 取消挂载后重新挂载,并增加-o allow_other参数: sshfs -o allow_other ${USER}@${HOST}:${DIR} ./remote

parallel

sudo apt install parallel

## 通过源码安装
curl -s -L https://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel > ~/.bin/parallel
chmod +x ~/.bin/parallel
export PATH="$HOME/.bin:$PATH"
source ~/.bashrc

libavif

sudo apt install libavif-bin
avifenc -q 75 input.[jpg|png|y4m] output.avif
avifdec output.avif decoded.png

imagemagick

sudo apt install imagemagick
convert input.jpg output.png

ffmpeg

sudo apt install ffmpeg
ffmpeg -i input.mp4 output.avi

Linux性能分析与调优

修改文件打开方式

  • 全局配置:/usr/share/applications/defaults.list
  • 用户配置:~/.local/share/applications/mimeapps.list

例如配置iso类型文件的打开方式一般默认是archive manager,如果想修改为nero,可以添加:application/x-cd-image=nerolinux.desktop;,然后图形界面下双击iso文件就使用nero打开了。

Linux重装系统指南(Ubuntu)

  • 安装金山wps,解决字体问题
     fedora:/opt/kingsoft/wps-office/office6/wps: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
     yum install libstdc++-devel.i686
  • 卸载libreoffice/firefox/youker-assistant/amazon
  • 重新启动计算机
  • 安装GLX-Dock并进行配置
  • 安装快盘,进行配快盘和ubuntu one
  • 安装okular/meld
  • 卸载Rhythmbox/empathy/account-plugin-*
  • 安装font-manager

Linux重装系统指南(Fedora)

  • 安装gnome-tweak-tool设置工具
  • sudo yum install gnome-tweak-tool
  • 安装后在左上角【活动】里可以找到【优化工具】图标打开进行设置
  • 安装最快软件源插件: sudo yum install yum-plugin-fastestmirror
  • 安装下载加速插件: sudo yum install yum-presto -y
  • 安装鼠标右键【在终端中打开】: sudo yum install nautilus-open-terminal
  • 配置RPM Fusion
  • 安装相关软件:gcc/Yumex/Compiz(ccsm)/Cariodock
  • 设置自动挂载文件系统fstab

ubuntu更新问题

更新管理器在检查软件包的时候总是有如下问题

无法下载 cdrom://Ubuntu 8.10 _Intrepid Ibex_ - Release i386 (20081029.5)/dists/intrepid/main/binary-i386/Packages  请使用 apt-cdrom,通过它就可以让 APT 能识别该光盘。apt-get upgdate 不能被用来加入新的光盘。
无法下载 cdrom://Ubuntu 8.10 _Intrepid Ibex_ - Release i386 (20081029.5)/dists/intrepid/restricted/binary-i386/Packages  请使用 apt-cdrom,通过它就可以让 APT 能识别该光盘。apt-get upgdate 不能被用来加入新的光盘。
无法下载 http://cn.archive.ubuntu.com/ubuntu/dists/intrepid-backports/main/binary-i386/Packages.bz2  Hash 校验和不符
有一些索引文件不能下载,它们可能被忽略了,也可能转而使用了旧的索引文件。

解决方法: 把 /etc/apt/sources.list里面有cdrom的几行删掉,或者利用软件中心或新立德包管理器把软件源终中的cdrom去掉。

libreoffice中PPT字体便粗问题

Tools → Options… → LibreOffice → View → Graphics output (取消钩选Use hardware acceleration)

主文件夹里的中文文件夹改成英文文件夹

打开终端,在终端下输入命令:

    export LANG=en_US
    xdg-user-dirs-gtk-update

这个时候会弹出一个配置界面,提示是否将中文目录切换为英文目录。选中不再提示,确定。系统会删除没有内容的中文目录,而有内容的目录会保持。并创建8个相应的英文目录如下: “Desktop”、“Download”、“Templates”、“Public”、“Documents”、“Music”、“Pictures”、“Videos”。此时,您在“位置”里看到的常用中文目录已经变成英文目录;

再执行:

    export LANG=zh_CN.UTF-8

local设置不准确(适用于WSL2)

jiang@jiang:~$ locale -a C C.utf8 POSIX

sudo apt install -y language-pack-zh-hans

jiang@jiang:~$ locale -a C C.utf8 POSIX zh_CN.utf8 zh_SG.utf8

jiang@jiang:~$ sudo update-locale LANG=zh_CN.UTF8

由于缺少字体而显示乱码(适用于WSL2)

sudo apt install -y fontconfig fonts-noto-cjk fonts-noto-color-emoji fc-cache -fv

重装Ubuntu如何保留/home分区中的数据

windows系统可以在重装时只格式化C盘,从而保留其他分区的数据。 Ubuntu系统也可以,只要在安装系统时分出一个/home分区。你可以把Ubuntu的“/”分区看为windows的C盘,重装Ubuntu时只格式化“/”分区,不格式化“/home”,这样就可以保留“/home”中的数据

如何启用 Ubuntu 中的 root 帐号

和其它发行版本的Linux不同,Ubuntu Linux有一个与众不同的特点,那就是初次使用时,你无法作为root来登录系统,为什么会这样?这就要从系统的安装说起。对于其他Linux系统来说,一般在安装过程就设定root密码,这样用户就能用它登录root帐户或使用su命令转换到超级用户身份。与之相反,Ubuntu默认安装时,并没有给root用户设置口令,也没有启用root帐户。问题是要想作为root用户来运行命令该怎么办呢?没关系,我们可以使用sudo命令达此目的。sudo是linux下常用的允许普通用户使用超级用户权限的工具,该命令为管理员提供了一种细颗粒度的访问控制方法,通过它人们既可以作为超级用户又可以作为其它类型的用户来访问系统。这样做的好处是,管理员能够在不告诉用户root密码的前提下,授予他们某些特定类型的超级用户权限,这正是许多系统管理员所梦寐以求的。这里有必要说先简单一下sudo和su命令的区别: su命令是在不退出当前用户的情况下切换用户的工具,通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,而普通用户切换到其它任何用户都需要密码验证。sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他特许用户才能完成的任务这样一来,就不仅减少了root用户的登陆次数和管理时间,也提高了系统安全性。sudo设计者的宗旨是: 给用户尽可能少的权限但仍允许完成他们的工作。我们可以简单的理解成: su获得稳定的超级用户(或其他用户权限),sudo获得暂时性的限制了的超级用户权限,一段时间之后会失效。

好,下面讲一下具体的设置方法:

1.为root设置一个root密码: $ sudo passwd root

之后会提示要输入root用户的密码,连续输入root密码

2.使用: $ su,并按照提示输入root密码,就可以在终端中切换成超级管理员用户身份了!

Linux用户添加sudoer

使用sudo可以在以非root用户登录时临时获得root权限,并执行需要的命令。可以使用sudo的用户可以叫做sudoer。

添加sudoer的方法(假设您已经安装sudo): 执行

visudo or sudoedit

提示: 有些发行版的sudo提供了sudoedit,有的则提供了visudo,功能上基本是一样的。你也可以使用其他编辑器如vi进行编辑/etc/sudoers,但由于文件是只读的,请强制保存(如w!)或去除只读属性再保存。查找

root ALL=(ALL) ALL

在下面加入

%adm ALL=(ALL) ALL

如果sudo时不想输入密码,可以把上句改成:

%adm ALL=(ALL) NOPASSWD: ALL

保存文件,然后执行

gpasswd -a 用户名 adm

然后这个用户就可以用sudo了。

linux无root权限安装软件

在有些公司是不会给开发人员root权限的,但是开发人员有时候也需要装一些软件。没有root权限是否可以成功安装软件呢?答案是yes。本文以安装nginx为例说明下如何操作。

没有root权限时往往也就没有权限操作一些系统目录,例如bin,usr等。所以在安装时需要配置将安装文件装在当前用户有权限操作的目录。

安装nginx首先要下载安装文件,具体的安装步骤如下:

    tar-zvxf nginx-1.2.3.tar.gz # 解压缩文件:
    cd ~
    mkdir nginx
    cd xxx
    ./configure—prefix=/xxx/yy/nginx
    make
    make install

正常情况下这样就成功安装了。和有root权限安装的区别在于./configure 需要指定安装文件的目录

linux系统下无法访问电脑硬盘

    Error mounting /dev/sda6 at /media/qiaokaiming/20F47472F4744BD2: Command-line 'mount -t "ntfs" -o "uhelper=udisks2,nodev,nosuid,uid=1000,gid=1000,dmask=0077,fmask=0177" "/dev/sda6" "/media/qiaokaiming/20F47472F4744BD2"' exited with non-zero exit status 14: The disk contains an unclean file system (0, 0).
    Metadata kept in windows cache, refused to mount.
    Failed to mount '/dev/sda6': Operation not permitted
    The NTFS partition is in an unsafe state. Please resume and shutdown
    windows fully (no hibernation or fast restarting), or mount the volume
    read-only with the 'ro' mount option.

那个提示里有: Please resume and shutdown windows fully (no hibernation or fast restarting)。进win8把”快速启动“关掉就好了。控制面板》所有控制面板选项》电源选项》系统设置》关闭“启用快速启动”

/etc/profile和/etc/environment(Ubuntu)

先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文。将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。

原因是系统是先执行/etc/environment,后执行/etc/profile。/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,象日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。登陆系统时shell读取的顺序应该是 :

/etc/enviroment->/etc/profile–>$HOME/.profile–>$HOME/.env(如果存在)

如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。修改environment 之后,执行 source /etc/environment 可以立即生效。

如何在Ubuntu中屏蔽一个网站

打开/etc/hosts文件,添加下面这行

127.0.0.1 domain.com

更换domain.com为你要屏蔽的网站,你完成了编辑处理后,保存该文件并退出。

Windows/Linux文本文件格式转换

DOS/Windows和Linux/Unix的文本文件换行格式不同,基于 DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个LF(换行)。

DOS/Windows文本文件格式转换成Linux/Unix文本文件格式: sed -e 's/.$//' mydos.txt > myunix.txt

说明: 替代正则表达式与一行的最末字符匹配,而该字符恰好就是回车。我们用空字符替换它,从而将其从输出中彻底删除。

把Linux/Unix 文本文件格式转换成 DOS/Windows文本文件格式: sed -e 's/$/\r/' myunix.txt > mydos.txt

说明: ‘$’ 正则表达式将与行的末尾匹配,而 ‘\r’ 告诉 sed 在其之前插入一个回车。在换行之前插入回车,每一行就以 CR/LF 结束。

另外还有个方法,使用命令:

    unix2dos filename
    dos2unix filename

获取某程序的完整路径名

当我们在Linux下用ps aux 看到有如下一个进程时:

root     19463  0.0  0.0   1508   272 pts/0    S    16:43   0:00 ./server-a

如何获得程序server-a所在的完整路径呢?从上面ps 的输出中可以看出19463是server-a的PID号,那么运行如下命令: cat /proc/19463/environ ,输出如下:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/gamesGNOME_KEYRING_PID=2269USER=jiangxinLANGUAGE=zh_CN:XDG_SEAT=seat0TEXTDOMAIN=im-configCOMPIZ_CONFIG_PROFILE=ubuntuHOME=/home/jiangxinQT4_IM_MODULE=fcitxDESKTOP_SESSION=ubuntuXDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0GTK_MODULES=overlay-scrollbar:unity-gtk-moduleGNOME_KEYRING_CONTROL=/run/user/1000/keyring-wrFl7VQT_QPA_PLATFORMTHEME=appmenu-qt5MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.pathIM_CONFIG_PHASE=1SESSIONTYPE=gnome-sessionLOGNAME=jiangxinGTK_IM_MODULE=fcitxDEFAULTS_PATH=/usr/share/gconf/ubuntu.default.pathXDG_SESSION_ID=c3GDM_LANG=zh_CNXDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0XDG_RUNTIME_DIR=/run/user/1000DISPLAY=:0XDG_CURRENT_DESKTOP=UnityLANG=zh_CN.UTF-8XAUTHORITY=/home/jiangxin/.XauthorityXMODIFIERS=@im=fcitxXDG_GREETER_DATA_DIR=/var/lib/lightdm-data/jiangxinSHELL=/bin/bashGDMSESSION=ubuntuTEXTDOMAINDIR=/usr/share/locale/XDG_VTNR=7QT_IM_MODULE=ximPWD=/home/jiangxinXDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdgXDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/CLUTTER_IM_MODULE=ximSELINUX_INIT=YESUBUNTU_MENUPROXY=1DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-BqwNaGt8wESSH_AUTH_SOCK=/run/user/1000/keyring-wrFl7V/sshSSH_AGENT_PID=2383SSH_AGENT_LAUNCHER=upstartGNOME_DESKTOP_SESSION_ID=this-is-deprecatedJOB=gnome-sessionINSTANCE=UnityUPSTART_EVENTS=started startingUPSTART_JOB=unity-settings-daemonUPSTART_INSTANCE=UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/2299GPG_AGENT_INFO=/run/user/1000/keyring-wrFl7V/gpg:0:1

注意输出中的: PWD=/data1/1230。由此可以判断出程序server-a所在完成路径为: /data1/1230/server-a。来,验证一下吧:

bash-3.2# ls -l /data1/1230/server-a
-rwxr-xr-x 1 root root 5842 Feb 25 16:42 /data1/1230/server-a

/proc/进程号目录下的文件说明

  • cwd符号链接的就是进程的运行目录;
  • exe符号连接就是执行程序的绝对路径;
  • cmdline就是程序运行时输入的命令行命令;
  • cpu记录了进程可能运行在其上的cpu;显示虚拟的cpu信息
  • environ记录了进程运行时的环境变量
  • fd目录下是进程打开或使用的文件的符号连接

Linux中C语言如何清空标准输入流

今天在Linux程序设计的时候需要清空标准输入缓冲区,于是使用了如下Windows程序设计中的方法: fflush(stdin),这个fflush()函数根本不是标准C中的函数,只是标准C的扩展,所以在Linux中使用根本不行;在网上搜索了下,发现有网友建议使用rewind(stdin);这个函数其实是将指针指向流的开始处。但是它是文件操作中的一个函数,操作的是FILE型流,在Windows程序设计中是可以清空标准输入缓冲区的,但是在Linux中不行。

注: 上述内容有几处错误,详见《The Standart Library》

Linux上可以通过getchar()函数读完标准缓冲区中的剩余字符来清空标准缓冲区:

char ch;
while((ch=getchar())!='/n'&&ch!=EOF);

怎样给变量传递执行命令结果

在linux shell脚本里,设置一个变量,但是变量是一个命令,需要将执行结果放到变量里,并输出,例如: ip=’ifconfig eth0’ echo $ip,怎样可以叫页面显示的是eth0的网络状况?就是ifconfig eth0的结果?

ip=`ifconfig eth0`
echo $ip

使用反引号可以把一个命令的输出插到另一个命令中去。相同功能的写法还有$(),功能同反引号效果是一样的。不过某些unix系统不支持$()这种写法。但是反引号在任何unix或linux系统下都可以使用。

debian hosts文件中的 127.0.1.1 主机地址

有时候/etc/hosts文件会看到127.0.0.1这个地址,即本地接口的回路/回环地址。但有时候/etc/hosts文件中还会出现127.0.1.1,这也是个本地回路/回环地址。出现这个地址的原因是因为有些应用程序需要规范的全限定域名FQDN(Fully Qualified Domain Name),FQDN不只需要主机名还需要主机域名,其表达形式为hostname.domainname。如果你的主机有一个静态IP地址,则FQDN名字解析到这个静态地址,否则解析到127.0.1.1这个本地回路地址。所以一般情况下不会看到127.0.1.1这个地址。127.0.0.1一般只对应hostname,这也是二者的主要区别。

127.0.0.1 hostname
127.0.1.1 hostname.domainname

当然并一定非要用127.0.1.1这个IP,RFC规定的127.0.0.0/8这个IP段内的任意IP都可以,只要没有冲突,debian选择了127.0.1.1

hostname # 查看主机名
hostname --fqdn # 查看FQDN名字

解决ubuntu终端颜色消失问题

ubuntukylin-13.10登陆用户使用ls命令,终端显示的所有输出都是黑底白字,没有彩色,su - root后使用ls命令,输出为彩色。分别在登陆用户和root用户下执行echo $PS1 输出有差异。后发现登陆用户目录下没有.bashrc文件。复制默认.bashrc文件后解决: cp /etc/skel/.bashrc ~/

YUM相关问题解决

  • yum history [undo redo info …]: yum的子命令,显示你yum的历史记录,并且可以撤销指定的记录(undo),重做指定记录(redo)等等,更多的功能看man yum
  • yum-plugin-remove-with-leaves: 卸载软件包时把因此产生的叶子一起卸载掉,用的时候别加-y选项,看清楚了再确认,有些非常大的依赖树会把主要的系统组件卸载掉,具体用法安装完该插件以后看帮助:yum –help,这个yum插件应该就是最贴近你需求的,不过记住,慎用,如果能从yum history里查到记录的话,还是用yum history undo来操作比较安全。
  • yum-plugin-show-leaves: 执行安装/卸载以后,显示此次操作所产生的叶子,自动运行,无需要操作。
  • rpmreaper: 基于ncurses库的程序,通过基于文本的gui界面显示系统中的rpm依赖树,提供各种操作,具体的看man。
  • yum update: 升级系统

There are unfinished transactions remaining

使用yum安装东西报错:There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.。可能之前有强制结束yum过,解决办法如如下:

yum -y install yum-utils # 安装 yum-complete-transaction(这是一个能发现未完成或被中断的yum事务的程序)
yum clean all # 清除yum缓存
yum-complete-transaction --cleanup-only # 运行 yum-complete-transaction,清理未完成事务

注: yum会把下载的软件包和header存储在cache中,而不会自动删除.可用yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all全清.

another app is currently holding the yum lock;waiting for it to exit

yum提示如标题,可能是系统自动升级正在运行,yum在锁定状态中。可以强制关掉yum进程: rm -f /var/run/yum.pid

设置开机直接进入命令行

16.04之前的Ubuntu版本,需编辑文件/etc/default/grub,把 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”改成GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash text”,然后运行sudo update-grub。在控制台下想进入x-window,可以在root用户下输入: gdm或者startx

16.04及之后的Ubuntu版本,需要执行如下命令设置开机启动直接进入命令行或者恢复默认图形界面启动

sudo systemctl disable lightdm.service
sudo ln -s /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service #恢复默认图形界面启动

CentOS/Redhat可以参考如下地址:http://blog.csdn.net/zoubf/article/details/47607039

Comments