标签: bash

Bash 中的多个 sed 命令

我有一个 JSON 格式的文件用户名和密码,我想将其转换为进程。

我使用sed了不同的命令来处理它,但我想知道的是如何将所有三个命令合并为一个以备将来使用。

原始格式

    { "user.name1" : "hashed_password",
"user.name2" : "hashed_password" }
Run Code Online (Sandbox Code Playgroud)

期望输出

user.name:hashed_password
Run Code Online (Sandbox Code Playgroud)

这些是我运行的命令,但是我无法使用管道将它们链接在一起,或者只是在出现错误的地方将它们连接起来,sed: -e expression #1, char 8: unknown option to 's'.

违规命令...

sed -i 's/\"//g/s/\,/\n/g/\s//g' input_file 
sed: -e expression #1, char 8: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

如何将以下命令连接为一个?

命令删除双引号

sed -i 's/\"//g' input_file

用新行替换逗号

sed -i 's/\,/\n/g' input_file

删除空格

sed -i 's/\s//g input_file

linux bash sed

5
推荐指数
1
解决办法
7653
查看次数

为什么 du -b 显示的结果与 stat 不同?

我最近遇到了这个问题:

find /tmp/tmp33hn25wv -type f -exec stat --format='%s' {} + | awk '{s+=$1} END {print s}'
10420224

du -bs /tmp/tmp33hn25wv
12198004    /tmp/tmp33hn25wv
Run Code Online (Sandbox Code Playgroud)

结果始终不同。所有文件都以块大小字节的倍数写入。

du在哪里找到这些额外的字节?我知道文件系统可能需要更多或更少的空间来存储文件的内容,但我希望该-b选项du意味着它必须计算“表观”大小,而不是文件系统使用的大小......

linux bash filesystems du

5
推荐指数
1
解决办法
297
查看次数

如何在 Linux bash 中创建带有位置参数的别名?

假设我有一个带有几个选项的 bash 命令和我感兴趣的变量(例如文件名):

my_cmd option1 option2 filename
Run Code Online (Sandbox Code Playgroud)

我创建了一个别名:

alias my_cmd_12="my_cmd option1 option2"
Run Code Online (Sandbox Code Playgroud)

这允许我删除输入所有选项。但是,在我感兴趣的变量之后有一些标志(例如文件名):

my_cmd option1 option2 filename --flag1
Run Code Online (Sandbox Code Playgroud)

如何创建一个带有所有选项和标志的别名:

my_alias filename 相当于

my_cmd option1 option2 filename --flag1

linux bash command-line

5
推荐指数
1
解决办法
1351
查看次数

在 Rstudio linux 终端中禁用“>”操作符

对于 Rstudio 中 Linux 集群上通过 SSH 的交互式会话,当 Rstudio 控制台中突出显示命令时,很容易意外执行“在终端中运行”的键盘快捷键。这会导致诸如

\> library
Run Code Online (Sandbox Code Playgroud)

或者

Var1>Var2
Run Code Online (Sandbox Code Playgroud)

在终端中执行,如果终端在 bash 提示符下登录,则会在远程工作目录中创建一个libraryVar2文件。

在最坏的情况下,这将导致覆盖远程工作目录中的文件。

我想在这些会话中禁用“>”,但我不确定如何执行此操作。

linux ssh terminal bash rstudio

5
推荐指数
1
解决办法
847
查看次数

管道(我剪贴板中的一个补丁)到`git apply`?

我在 OSX 剪贴板中复制了一个补丁(来自 ssh)。只是想知道是否有一种方法可以编写命令来使用我的剪贴板,而不是手动制作补丁文件

bash git

5
推荐指数
1
解决办法
1954
查看次数

在 macOS Catalina 中切换到 Zsh 不起作用

我决定冒险尝试并切换到zsh. 所以,我按照终端窗口的说明输入:

chsh -s /bin/zsh
Run Code Online (Sandbox Code Playgroud)

然后我进入echo $0查看开关 - 它返回了-bash

然后,我转到支持页面,并按照那里的说明通过系统偏好设置进行更改。但是,“登录外壳”下拉菜单已经显示zsh

显示 <code>zsh</code> 的登录 shell 下拉列表

所以,我想也许我需要重新启动......不,系统偏好设置仍然显示zsh,终端返回-bash,当我尝试重新运行时chsh -s /bin/zsh,终端返回chsh: no changes made

echo $SHELL在终端中运行返回/bin/zsh

我错过了什么???

terminal bash zsh macos-catalina

5
推荐指数
1
解决办法
4943
查看次数

如何更改 WSL bash 命令的默认目录?

我在装有 Ubuntu 的计算机上设置了 WSL(适用于 Linux 的 Windows 子系统)。当我想要一个 Linux 会话时,我会点击Win+R 并输入,bash因为它既短又快。但是,它总是让我陷入/mnt/c/Users/Michael. 我希望它把我放到我的 Ubuntu 主目录 ( ~) 中。

我尝试添加cd ~到我的 .bash_profile,但是每当我尝试从命令行运行时bash,它总是将我带到~,而不是在当前目录中打开 bash。

我可以通过ubuntu从运行对话框运行来解决这个问题,但它需要更长的时间并且更难拼写。

从运行对话框运行时如何bash打开~,从命令提示符或 PowerShell 运行时如何打开当前工作目录?或者,有什么好的解决方法?

bash run-dialog ubuntu windows-subsystem-for-linux

5
推荐指数
1
解决办法
2105
查看次数

shopt:“&amp;&amp;”有什么问题?

我不明白为什么当我单独做它们时它会起作用但&&它不会(这不是(像这里问题)......我错过了什么?

11:20:06 $ shopt -s extglob && shopt -s globstar && for f in **/*.@(jpg|jpeg|png|gif); do [[ -f "$f.webp" ]] || cwebp -quiet -q 80 "$f" -o "$f.webp"; done
bash: syntax error near unexpected token `('
11:20:11 $ shopt -s extglob && shopt -s globstar 
11:20:16 $ for f in **/*.@(jpg|jpeg|png|gif); do [[ -f "$f.webp" ]] || cwebp -quiet -q 80 "$f" -o "$f.webp"; doneError! Could not process file img/colorpicker/colormap.gif
11:20:23 $ 
Run Code Online (Sandbox Code Playgroud)

linux bash shell

5
推荐指数
1
解决办法
570
查看次数

使用模式文件的反向 grep 不显示不匹配

我有两个几乎相同的文件,"foo" 和 "bar"

每个文件有数千行,每行一个数字。

如果我sort然后diff两个文件,这是结果:

$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489
Run Code Online (Sandbox Code Playgroud)

但是,如果我有grep -Fvf两个文件,我在两个方向上都会得到零个“不匹配”:

$ grep -Fvf foo bar
$ grep -Fvf bar foo
$
Run Code Online (Sandbox Code Playgroud)

这是为什么?我不应该得到类似于 diff 的结果吗?我希望第一个命令返回 diff 值的“前半部分”,第二个 grep 命令返回其余部分。

为什么我没有得到预期的结果?

linux bash grep command-line

5
推荐指数
1
解决办法
556
查看次数

为什么非root用户不能使用通配符表达式?

我正在使用通配符表达式来匹配文件名。

这是普通的非 root 用户会发生的情况:

debian@MiWiFi-R3-srv:~$ sudo ls  /var/log/apache2/*[0-9].gz
ls: cannot access '/var/log/apache2/*[0-9].gz': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这就是我切换到 root 用户sudo su并尝试相同的命令后发生的情况:

root@MiWiFi-R3-srv:/home/debian# ls  /var/log/apache2/*[0-9].gz
/var/log/apache2/access.log.10.gz  /var/log/apache2/error.log.10.gz
/var/log/apache2/access.log.11.gz  /var/log/apache2/error.log.11.gz
/var/log/apache2/access.log.12.gz  /var/log/apache2/error.log.12.gz
Run Code Online (Sandbox Code Playgroud)

为什么这个通配符表达式可以用作root,但不能用作普通的非 root 用户?

bash shell wildcards

5
推荐指数
1
解决办法
2160
查看次数