这有点棘手;我正在尝试找出解决此问题的最佳方法。我有几种方法,但它们看起来很笨拙,我想要更优雅的东西。
我想解析一个空格分隔的文件,忽略#comment lines并抱怨任何不具有 4 个字段的非空行。这在以下方面很容易awk:
awk '/^#/ {next}; NF == 0 {next}; NF != 4 {exit 1}; (dostuff)'
Run Code Online (Sandbox Code Playgroud)
诀窍是我想对数据做些什么,实际上是将其设置为变量bash,然后运行一个bash函数,除非 $2 包含特定值。
这是一些伪代码(主要是真实但混合语言)来解释我的意思:
# awk
/^#/ {next}
NF == 0 {next}
NF != 4 {exit 1}
$2 == "manual" {next}
# bash
NAME=$1
METHOD=$2
URL=$3
TAG=$4
complicated_bash_function_that_calls_lots_of_external_commands
# then magically parse the next line with awk.
Run Code Online (Sandbox Code Playgroud)
我不知道如何在没有一些丑陋的解决方法的情况下执行此操作,例如调用awk或sed单独调用文件的每一行。(最初我提出的问题是“如何从 awk 中调用 bash 函数或从 bash 中调用 awk 的每个输出行?”)
可能将 bash …
来自 Unix Power Tools 第 3 版第 175 页:
第 9.27 节展示了一种匹配路径中间目录的方法。这是一个更简单的“查找文件”别名,可以派上用场:
alias ff "find . -name '*\!{*}*' -ls"给它一个文件或目录名;别名将给出包含参数的任何文件或目录名称的长列表。
(这也可以在线获得。)
我根本没有得到-name操作员的论据。这是笔误吗?它仅适用于特定版本find吗?反斜杠、bang 和花括号的作用是什么?
我想检查 shell 变量是否包含绝对路径。
我不在乎路径是否存在——如果它不存在,我将创建它——但我确实想确保我正在处理一个绝对路径名。
我的代码如下所示:
myfunction() {
[ magic test to see if "$1" is an absolute path ] || return 1
mkdir -p "$(dirname "$1")" || return 1
commands >> "$1"
}
Run Code Online (Sandbox Code Playgroud)
或者,要验证的绝对路径是目录的用例:
anotherfunction() {
[ same magic test ] || return 1
mkdir -p "$1"
dostuff >> "$1/somefile"
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,awk我会像这样进行检查:myvar ~ /^\//
还有必须是干净的方式与外壳的字符串处理要做到这一点,但我有想出它的麻烦。
(提及一个bash特定的解决方案会很好,但我想知道如何以可移植的方式执行此操作。POSIX 字符串处理似乎应该足够了。)
我好像从本站的评论中记得算术展开的内容可能是分词的,但是又找不到评论了。
考虑以下代码:
printf '%d\n' "$(($(sed -n '/my regex/{=;q;}' myfile)-1))"
Run Code Online (Sandbox Code Playgroud)
如果sed命令输出一个多位数字并且$IFS包含数字,那么在算术发生之前,命令替换是否会进行单词拆分?
(我已经使用额外的双引号进行了测试:
printf '%d\n' "$(("$(sed -n '/my regex/{=;q;}' myfile)"-1))"
Run Code Online (Sandbox Code Playgroud)
这不起作用。)
顺便说一句,上面的示例代码是我刚刚在 Stack Overflow 上发布的这个函数的简化形式的更改。
在 shell 脚本中,我们具有${name}明确指定变量名称并将其与周围文本分开的构造。
在 中awk,我可以引用$5变量 N 指向的第五个字段 with或第 N 个字段$N。
如果我想引用第N+1个字段怎么办?如果我使用,$N+1我会得到第 N 个字段的内容加 1,这不是我想要的。
我可以设置另一个变量temp = N+1然后引用$temp,但是没有办法一次性指定“Nth plus 1”字段吗?
或者,就此而言,我可以引用函数返回 N 的第 N 个字段吗?
我有一个foo输出文件名列表的命令:
$ foo
file1.a
file2.b
file3.a
Run Code Online (Sandbox Code Playgroud)
以及bar接受.a文件名作为参数并进行一些处理的命令:
$ bar file1.a file3.a
Great success!
$ bar file2.b
FAILURE
Run Code Online (Sandbox Code Playgroud)
我想将两者与类似的管道结合起来foo | xargs bar,但我需要过滤掉所有不以.a. 我怎样才能做到这一点?理想情况下,我想要一些简单的东西,我可以将它放在管道中的两个命令之间,例如foo | filter-lines ".a" | xargs bar.
难道我做错了什么?我想我正在按照手册页中的说明进行操作,但它没有任何效果。
[501] $ history | tail
492 echo 3
493 echo 4
494 echo 5
495 echo 6
496 echo 7
497 echo 8
498 echo 9
499 echo 10
500 PS1='[\!] \$ '
501 history | tail
[502] $ tail ~/.bash_history
echo 1
echo 2
echo 3
echo 4
echo 5
echo 6
echo 7
echo 8
echo 9
echo 10
[503] $ history -a
[504] $ tail ~/.bash_history
echo 1
echo 2
echo 3
echo 4
echo 5 …Run Code Online (Sandbox Code Playgroud) 在 bash 脚本中,您将如何编写以下脚本?
USER_INPUT="1 2 3 4 5"
echo "Please select one of the following values: $USER_INPUT"
Prompt the user to choose a value in $USER_INPUT.
echo "command <user input> <iterate through remaining numbers not selected from $USER_INPUT>
Run Code Online (Sandbox Code Playgroud)
例如,如果用户选择“2”,则运行以下命令。
command 2 1
command 2 3
command 2 4
command 2 5
Run Code Online (Sandbox Code Playgroud) 当然文件可以打开,也可以不打开。
但是,根据定义,文件描述符是指打开的文件(对吧?)。(好吧,除非它指的是文件以外的东西,比如管道或你拥有的东西。但它仍然是打开的。)
我多次遇到过“打开文件描述符”这个词。我相信这是多余的,实际上除了打开的文件描述符之外没有其他类型的文件描述符 - 但我想验证这一点。
除了“打开”之外,文件描述符是否处于任何其他状态?(当它关闭时,它不是不复存在了吗?)
根据man ps:
-p pidlist
Select by PID. This selects the processes whose process ID
numbers appear in pidlist. Identical to p and --pid.
-q pidlist
Select by PID (quick mode). This selects the processes
whose process ID numbers appear in pidlist. With this
option ps reads the necessary info only for the pids listed
in the pidlist and doesn't apply additional filtering
rules. The order of pids is unsorted and preserved. No
additional selection options, sorting and forest …Run Code Online (Sandbox Code Playgroud) bash ×5
awk ×2
performance ×2
shell-script ×2
alias ×1
arithmetic ×1
command-line ×1
csh ×1
display ×1
filenames ×1
find ×1
open-files ×1
posix ×1
ps ×1
scripting ×1
string ×1
terminal ×1
terminology ×1
wildcards ×1
words ×1