小编cha*_*aos的帖子

使用 awk 处理 3 个文件

考虑以下文件:

file1

boo,8,1024
foo,7,2048
Run Code Online (Sandbox Code Playgroud)

file2

foo,0,24,154
noo,0,10,561
Run Code Online (Sandbox Code Playgroud)

file3

24,154,7,1024,0
Run Code Online (Sandbox Code Playgroud)

我需要的是去File1并检查是否$2==7;如果为真,取$1,$2$3来自File1 ; 现在我必须比较$1来自File1 是否等于$1来自File2;如果为真,我必须从File1中不存在的File2$3和,然后我必须转到File3并检查from File3是否等于from File2,以及from File3等于from File2;如果是,那么我必须检查是否来自File1$4$1$3$2$4$2等于$3from File3,那么如果这个条件为真,我必须比较$3from File1$4from File3,如果$3from File1大于$4from File3

我尝试了以下脚本: …

awk text-processing gawk

9
推荐指数
1
解决办法
591
查看次数

如何删除shell脚本中所有子目录中的空间?

我尝试按照 shell 脚本删除所有带下划线的空格:

find $1 -depth -name "* *" -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
Run Code Online (Sandbox Code Playgroud)

如果我有一个目录,/home/user/g h/y h/u j/它会将y h目录修改为y_h,然后它会给出以下错误/home/user/g h/y h/u j

No such file or directory
Run Code Online (Sandbox Code Playgroud)

directory find shell-script rename mv

8
推荐指数
1
解决办法
5922
查看次数

如何在八进制中获得文件权限

我有一组 linux 文件夹,我需要以数字方式获取文件夹的权限。

例如在下面的目录中,我需要文件夹的权限值是什么...无论是 755、644 还是 622 等...

drwxrwsr-x 2 dev    puser 4096 Jul  7  2014 fonts
Run Code Online (Sandbox Code Playgroud)

linux permissions files

7
推荐指数
1
解决办法
1万
查看次数

手册中的“n”、“l”、“3pm”部分是什么?

man man页面摘录:

默认操作是按照预定义的顺序搜索所有可用部分(默认为“1 nl 8 3 2 3posix 3pm 3perl 5 4 9 6 7”)

手册的n,l3pm部分是什么?

man standard perl posix

7
推荐指数
1
解决办法
365
查看次数

从文件中读取带空格的带引号的数组元素?

我正在STDIN使用read如下方式将数据传递到数组中:

prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile
Run Code Online (Sandbox Code Playgroud)

read似乎没有注意引用的字符串并为我提供了一个包含 5 个元素的数组:

prompt$ echo ${#arr[@]}
5
prompt$ echo ${arr[@]:0}
a "bc" "d e" f
prompt$ echo ${arr[2]}
"d
prompt$ echo ${arr[3]}
e"
Run Code Online (Sandbox Code Playgroud)

我正在使用默认IFS设置:\t\nbash. 有几种方法可以使用不同的工具完成任务,但令我惊讶的是 read 不支持带引号的字符串。

将带引号的分隔列表放入数组中的任何其他建议?

scripting bash shell-script

7
推荐指数
2
解决办法
2986
查看次数

排序 /etc/ld.so.conf 可以吗

我想知道我是否可以将条目/etc/ld.so.conf排序。

ld.so.conf现在看起来像这样:

/usr/X11R6/lib64/Xaw3d
/usr/X11R6/lib64
/usr/lib64/Xaw3d
/usr/X11R6/lib/Xaw3d
/usr/X11R6/lib
/usr/lib/Xaw3d
/usr/x86_64-suse-linux/lib
/usr/local/lib
/opt/kde3/lib
/usr/local/lib64
/opt/kde3/lib64
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/cuda-6.5/lib64
Run Code Online (Sandbox Code Playgroud)

当我排序时,它看起来像这样 - 我可以安全地进行排序还是它们是我会“破坏”排序的一些依赖项?

/lib
/lib64
/opt/kde3/lib
/opt/kde3/lib64
/usr/X11R6/lib
/usr/X11R6/lib/Xaw3d
/usr/X11R6/lib64
/usr/X11R6/lib64/Xaw3d
/usr/lib
/usr/lib/Xaw3d
/usr/lib64
/usr/lib64/Xaw3d
/usr/local/cuda-6.5/lib64
/usr/local/lib
/usr/local/lib64
/usr/x86_64-suse-linux/lib
include /etc/ld.so.conf.d/*.conf
Run Code Online (Sandbox Code Playgroud)

shared-library ld

7
推荐指数
1
解决办法
1万
查看次数

如何根据 ps 输出杀死一堆作业?

这里是输出ps

$ ps aux | grep blob
ubuntu    4286  0.0  0.1  34748  9592 ?        S    Jan14   0:00 /usr/bin/python /usr/local/bin/pynt start_blob_reader
ubuntu    4287  0.0  0.1  34748  9596 ?        S    Jan14   0:00 /usr/bin/python /usr/local/bin/pynt start_blob_reader
ubuntu    4288  0.0  0.0   4444   656 ?        S    Jan14   0:00 /bin/sh -c python -m blob_manager blob
ubuntu    4289  1.2  0.2  65512 20668 ?        S    Jan14 1974:18 python -m blob_manager blob
ubuntu    4290  0.0  0.0   4444   656 ?        S    Jan14   0:00 /bin/sh -c python -m blob_manager …
Run Code Online (Sandbox Code Playgroud)

command-line bash process kill zsh

6
推荐指数
1
解决办法
2343
查看次数

带有 || 的条件执行块 和括号问题

所以这应该很简单。我正在尝试测试脚本顶部的条件并在条件失败时退出整个脚本,并且我有两个语句要在退出时执行。有一个单独的exit没有第二个语句,这很好,但是无论我如何添加第二个语句,我都无法让它完全退出。隐含的装饰规则是这一切都必须在一行上。当对脚本的这种单行更改没有按预期工作时,我发现了这一点。剧本一直在进行。

首先让我展示一下什么有效的。如果 $USER 变量不是“x”,则以下行完全退出,这很好。我知道这是有效的,因为在终端窗口中输入这一行将关闭该终端窗口(除非您的用户 ID 确实是“x”),因此它实际上是在执行顶级退出:

[ $USER = 'x' ] || exit 1
Run Code Online (Sandbox Code Playgroud)

所以这很好,就像我想要的那样,除了我想在退出之前回显一条消息;但是,如果我尝试添加回声,则退出不再发生,或者它似乎以“不同的方式”发生,例如可能在 bash 函数上下文或其他内容中。下一行不会关闭您的终端,这很糟糕。

[ $USER = 'x' ] || (echo "Time to bail" ; exit 1)
Run Code Online (Sandbox Code Playgroud)

我想也许分号被回声吃掉了,但不,出口似乎被击中了。我怎么知道?我更改了上面的代码,然后回显了 $? 我看到了我在上面看到“1”的地方放的任何值。当然,我是在我想关闭的终端窗口中查看这些值,但它并没有关闭。

下一个变体还显示了执行 echo 和第二个语句的第二种方法,但在使用 exit 时会再次发生完全相同的行为:

[ $USER = 'x' ] || (echo "Time to bail" && exit 1)
Run Code Online (Sandbox Code Playgroud)

我希望这里有人能让这一切不仅不奇怪而且看起来很合理。

那么这不可能在一条线上完成吗?

( bash --version: GNU bash, version 4.3.30(1)-release)

shell bash shell-script

6
推荐指数
1
解决办法
3103
查看次数

使用 SED(或任何其他 coreutil)重新格式化 CSV 列式

鉴于来自 hashdeep 的输出文件的以下组成部分:

7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
41,33333333333333333333333333333333,\01-data\file3
Run Code Online (Sandbox Code Playgroud)

我将如何将其格式化为:

   7241,11111111111111111111111111111111,\01-data\file1
1237241,22222222222222222222222222222222,\01-data\file2
     41,33333333333333333333333333333333,\01-data\file3
Run Code Online (Sandbox Code Playgroud)

我想使用 sed (因为这是我开始掌握的),但是有没有办法告诉 sed 仅在特定列或特定列中出现字符时才更改字符?

当然,如果有其他方法可以做到这一点,我也会很高兴听到这个消息。

这样做的原因是我想根据文件名对输出进行排序,以便我可以比较两个输出文件,而不必-j0在 hashdeep 上使用(单线程)选项。

sed text-processing

6
推荐指数
2
解决办法
264
查看次数

sudo 如何工作(除了 setuid)?

sudo启动时被提升为 root,因为它的二进制文件已setuid启用。但是,当我赋予/bin/login确切的权限时sudo,并尝试从非 root 用户运行它时,出现错误:

No utmp entry.  You must exec "login" from the lowest level "sh"
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是,这个错误是什么意思?我的第二个是,为什么当我sudo login从同一个用户运行时它会起作用?除了使用asetuuid提升到root之外,还有什么sudo工作?我写了一个简单的dash脚本~/root来运行whoami和退出,但它返回我的非特权用户的用户名。

$ ls -l ./root /usr/bin/sudo
-rwsr-xr-x 1 root root     29 Jul 15 02:40 ./root
-rwsr-xr-x 1 root root 157760 Jan 10  2016 /usr/bin/sudo

$ ./root
unprivileged user
Run Code Online (Sandbox Code Playgroud)

所以我有三个问题:

  1. 我得到的错误是什么login
  2. 为什么loginsudo?
  3. 为什么我要运行的简单脚本whoami不起作用?

setuid sudo shell-script

6
推荐指数
1
解决办法
398
查看次数