Linux Bash 命令速查表

某些工具的命令行参数

目录

不是非常全面的列表,只是对我有用的一些内容

bash和shell周年纪念!

检查Linux Ubuntu版本

方法1

lsb_release -a

会产生类似以下的内容

No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 22.1
Release:	22.1
Codename:	xia

方法2

cat /etc/os-release

会产生类似以下的内容

NAME="Linux Mint"
VERSION="22.1 (Xia)"
ID=linuxmint
ID_LIKE="ubuntu debian"
PRETTY_NAME="Linux Mint 22.1"
VERSION_ID="22.1"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.linuxmint.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=xia
UBUNTU_CODENAME=noble

归档与解归档

压缩

tar -zcvf archive-name.tgz directory-name

解压缩

tar -zxvf archive-name.tgz

远程服务器

将用户身份推送到远程服务器

ssh-copy-id user@10.0.0.225

这样下次登录时就可以不用密码,例如

ssh user@10.0.0.225

上传文件

scp ~/file.ext user@host-ip:/home/user/file.ext

递归下载包含嵌套内容的文件夹

scp -r user@host-ip:/home/user/dir ~/dir

文件夹和文件

检查是否存在

# 如果文件夹不存在,创建它并创建所有中间文件夹
[ -d $repdir ] || mkdir -p $repdir

# 或者
if [ -d $fname ]; then
  echo "文件不存在: $fname"
  return
fi

为特定用户创建文件夹

sudo mkdir dir1
sudo chown specific_user dir1
sudo chown :specific_group dir1

遍历文件夹中的文件

# 这个命令会将某个文件夹中的所有jpg文件转换为fits格式
for f in some-folder/*.jpg
do
  convert "$f" "${f/.jpg/.fits}"
done

将所有文件合并成一个

cat ./* > merged.txt

将命令执行添加到crontab

(crontab -l 2>/dev/null | \
  grep -v control-marker-1; \
  echo '*/15 * * * * /bin/bash /home/user/stest/stest.sh /home/user/stest >> /home/user/stest/stest.log 2>&1 #control-marker-1') | \
  crontab -

这里:

  • */15 - 每15分钟运行一次
  • control-marker-1 - 是此命令在cron配置中的标识符,下次用相同的脚本更新时使用
  • /bin/bash - 要执行的命令
  • /home/user/stest/stest.sh - bash参数 - 该bash将运行此脚本
  • /home/user/stest - 脚本参数 - 通过$1访问
  • /home/user/stest/stest.log - stest.sh的控制台输出日志文件

检查

grep /home/user/stest/stest.sh /var/log/syslog
crontab -e

日志

实时查看日志文件

sudo tail -f /var/log/megalog.log

curl的状态码

response=$(curl --write-out '%{http_code}' --silent --output /dev/null servername)
  
# 或者

url='http://localhost:8080/'
status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})

[[ $status == 500 ]] || [[ $status == 000 ]] && echo restarting ${url} # 执行启动/重启逻辑

退出ssh后让命令继续运行

https://stackoverflow.com/questions/954302/how-to-make-a-program-continue-to-run-after-log-out-from-ssh

假设你正在运行一个前台程序,按下

  • ctrl-Z,然后:

[1]+ 已停止 myprogram

  • disown -h %1
  • bg 1

[1]+ myprogram &

  • 退出

生成JSON

安装jo

sudo apt-get install jo
a="123"
b="456"
jo "model=a" "prompt=b" "stream=false"

将输出

{"model":"a", "prompt":"b", "stream":false}

更复杂一点:

jo -p name=Jane point[]=1 point[]=2 geo[lat]=10 geo[lon]=20
{
   "name": "Jane",
   "point": [
      1,
      2
   ],
   "geo": {
      "lat": 10,
      "lon": 20
   }
}

格式化JSON

使用

| jq .

格式化上面生成的JSON:

a="123"
b="456"
jo "model=$a" "prompt=$b" "stream=false" | jq .

格式化的JSON将为:

{
  "model": 123,
  "prompt": 456,
  "stream": false
}

解析JSON并返回某个字段的值

首先安装jq

sudo apt-get install jq

使用

  | jq -r '.fieldName'

例如解析对Ollama的调用输出:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Why is the sky blue?",
  "stream": false
}'  | jq -r '.response'

统计文件中的单词数量

单词计数:

wc -w filename.txt

将返回类似以下的内容

261 filename.txt

如果你想只获取整数,可以去掉第一个单词,它是一个数字

words=`wc -w filename.txt | cut -f1 -d' '`
echo "$words words"

或者使用wc如下:

words=`wc -w < filename.txt`
echo "$words words"

检查目录在硬盘上占用的空间

du ~/dirname

获取运行脚本所在的文件夹名称

SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )

测量脚本的执行时间

一个选项是使用time函数

time your_script.sh

另一种方式稍微复杂一点:

start=`date +%s`

# 非常重要的代码
# 在这里

end=`date +%s`

runtime=$((end-start))

用vs code比较两个文件

code -d <file 1> <file 2>

检查Ubuntu仓库中的可用包

sudo apt-cache policy <packageName>

有用的链接