我试图使用Bash替换来替换变量中的整个字符串,如果它匹配模式.例如:
pattern="ABCD"
${var/pattern/}
Run Code Online (Sandbox Code Playgroud)
删除(有没有替换)的第一次出现$pattern在$var
${var#pattern}
Run Code Online (Sandbox Code Playgroud)
$pattern在开头删除$var
但是,我怎么能删除正则表达式模式"^ABCD$"的$var?我可以:
if [ $var == "ABCD" ] ; then
echo "This is a match." # or whatever replacement
fi
Run Code Online (Sandbox Code Playgroud)
但这正是我正在寻找的.
我想使用#!/bin/awk -f标头编写 awk 脚本文件,但我希望该脚本始终用作:字段分隔符。但由于某种原因,写作#!/bin.awk -F: -f给了我一个语法错误。我还希望这个脚本始终在同一个文件上运行,所以我也想对其进行硬编码。基本上,我想要的工作是这样的:
#!/bin/awk -F: -f -- /etc/passwd
Run Code Online (Sandbox Code Playgroud)
接下来是一些 awk 代码
我读过一个剧本,发现其中有一个地方超出了我的理解范围。代码片段如下:
while getopts ":h-:" OPTION; do
case "$OPTION" in
-)
case "$OPTARG" in
time)
if [ ! -z "${!OPTIND:0:1}" -a ! "${!OPTIND:0:1}" = "-" ]; then
Time="${!OPTIND}"
OPTIND=$(( $OPTIND + 1 ))
fi ;;
esac
;;
h) Usage 0;;
# More code
esac
done
shift $((OPTIND - 1))
Run Code Online (Sandbox Code Playgroud)
我所困扰的一点是if条件。它到底意味着什么?
我知道getopts和相关变量OPTIND及其OPTARG提供的信息,但很难找出该语句满足什么条件if。
如果有人可以向我解释这一点,那将非常有帮助。
提前致谢
我有制表符分隔的文件,文件的文件1和文件2。我想创建子集划分由来自文件1的所有四列的行的文件3中,塔1和2从文件2匹配,该file1的看起来像:
1 17626 A G
1 20184 G A
1 108826 C G
1 108929 G C
Run Code Online (Sandbox Code Playgroud)
而且,file2为:
1 17626
1 20184
Run Code Online (Sandbox Code Playgroud)
我想要文件 3 中的输出如下
1 17626 A G
1 20184 G A
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下代码查看以前的问题:
awk -F '\t' 'NR==FNR{c[$1$2]++;next};c[$1$2]' file2 file1 > file3
awk -F '\t' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file2 file1 > file3
awk -F '\t' 'NR==FNR{a[$1$2]; next} FNR==1 || $1$2 in a' file2 file1 > file3
Run Code Online (Sandbox Code Playgroud)
从上面的两个命令,我得到一个空文件。而且,使用最后一个命令,我只得到一行输出,而不是预期的两行。
我有大量文件(约 50000 个文件)。
ls /home/abc/def/
file1.txt
file2.txt
file3.txt
.........
.........
file50000.txt
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含两列的 CSV 文件:第一列提供文件名,第二列提供绝对文件路径,如下所示:
输出.csv
file1.txt,/home/abc/def/file1.txt
file2.txt,/home/abc/def/file2.txt
file3.txt,/home/abc/def/file3.txt
.........................
.........................
file50000.txt,/home/abc/def/file50000.txt
Run Code Online (Sandbox Code Playgroud)
如何使用 bash 命令执行此操作。我尝试使用 ls 并找到
find /home/abc/def/ -type f -exec ls -ld {} \; | awk '{ print $5, $9 }' > output.csv
Run Code Online (Sandbox Code Playgroud)
但这给了我绝对路径。如何获得如上面的output.csv所示的输出
这是我的 df -h 输出
df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 98G 82G 17G 83% /
none 98G 82G 17G 83% /dev
none 98G 82G 17G 83% /run
none 98G 82G 17G 83% /run/lock
none 98G 82G 17G 83% /run/shm
none 98G 82G 17G 83% /run/user
tmpfs 98G 82G 17G 83% /sys/fs/cgroup
C:\ 98G 82G 17G 83% /mnt/c
Run Code Online (Sandbox Code Playgroud)
我只想查看
rootfs 98G 82G 17G 83% /
C:\ 98G 82G 17G 83% /mnt/c
Run Code Online (Sandbox Code Playgroud)
怎么做?C:\ 可能不同,但 /mnt/c 挂载点保持不变
如何使用 grep …
我在 linux 上做了一些研究,我遇到了这个 awk 脚本:
$ awk -F: '$3 >= 1000 && !($1 == "nobody" && $3 == 65534) { SUM+=1 } END { print SUM }' /etc/passwd
Run Code Online (Sandbox Code Playgroud)
它会通过统计 UID 大于或等于 1000 的用户并忽略特殊的 nobody 帐户来获取本地用户帐户的数量。
但是,我不明白代码。有人可以向我解释一下吗?